过滤数据并替换 pandas 中的值
filter data and replace values in pandas
我是 pandas 的新手,我正在尝试替换数据框特定列上的一些值。我的数据框如下所示:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 3 3 3 3 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 5 5 5 5 f f
在第 1 行中,从第 2 列到第 5 列(st、mt、ast、sr)我在所有列中都有数字 3,在第 5 行中我在所有列中都有数字 5。当我使用下面的代码子集并尝试在这些列中用 0 替换 3 和用 0 替换 5 时,代码 return 行中的所有值都被 0 替换,而不仅仅是那些特定列中的值。我试过了:
df[(df.st == 5) & (df.mt == 5) & (df.ast == 5) & (df.sr == 5)]=0
但我得到了:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 0 0 0 0 0 0 0 0
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 0 0 0 0 0 0 0 0
我也试过:
df[(df.st == 5) & (df.mt == 5) & (df.ast == 5) & (df.sr == 5)].replace(5,0)
我想要的输出是:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 0 0 0 0 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 0 0 0 0 f f
我怎样才能实现这个目标?
对列表中的列名使用 DataFrame.loc
:
df.loc[(df.st == 5) & (df.mt == 5) & (df.ast == 5) & (df.sr == 5), ['st','mt','ast','sr']]=0
另一个想法是仅使用选定的列表进行比较 5
by DataFrame.eq
and test if all values Trues by DataFrame.all
:
cols = ['st','mt','ast','sr']
df.loc[df[cols].eq(5).all(axis=1) | df[cols].eq(3).all(axis=1), cols]=0
print (df)
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 0 0 0 0 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 0 0 0 0 f f
如果你想确保你在 ['st', 'mt', 'ast', 'sr']
和 中有所有相同的值并且这个值在给定列表中,你可以使用 2 个掩码:
m1 = df[cols[1:]].eq(df[cols[0]], axis=0).all(1)
m2 = df[cols[0]].isin([3,5])
df.loc[m1 & m2, cols] = 0
输出:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 0 0 0 0 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 0 0 0 0 f f
我是 pandas 的新手,我正在尝试替换数据框特定列上的一些值。我的数据框如下所示:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 3 3 3 3 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 5 5 5 5 f f
在第 1 行中,从第 2 列到第 5 列(st、mt、ast、sr)我在所有列中都有数字 3,在第 5 行中我在所有列中都有数字 5。当我使用下面的代码子集并尝试在这些列中用 0 替换 3 和用 0 替换 5 时,代码 return 行中的所有值都被 0 替换,而不仅仅是那些特定列中的值。我试过了:
df[(df.st == 5) & (df.mt == 5) & (df.ast == 5) & (df.sr == 5)]=0
但我得到了:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 0 0 0 0 0 0 0 0
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 0 0 0 0 0 0 0 0
我也试过:
df[(df.st == 5) & (df.mt == 5) & (df.ast == 5) & (df.sr == 5)].replace(5,0)
我想要的输出是:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 0 0 0 0 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 0 0 0 0 f f
我怎样才能实现这个目标?
对列表中的列名使用 DataFrame.loc
:
df.loc[(df.st == 5) & (df.mt == 5) & (df.ast == 5) & (df.sr == 5), ['st','mt','ast','sr']]=0
另一个想法是仅使用选定的列表进行比较 5
by DataFrame.eq
and test if all values Trues by DataFrame.all
:
cols = ['st','mt','ast','sr']
df.loc[df[cols].eq(5).all(axis=1) | df[cols].eq(3).all(axis=1), cols]=0
print (df)
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 0 0 0 0 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 0 0 0 0 f f
如果你想确保你在 ['st', 'mt', 'ast', 'sr']
和 中有所有相同的值并且这个值在给定列表中,你可以使用 2 个掩码:
m1 = df[cols[1:]].eq(df[cols[0]], axis=0).all(1)
m2 = df[cols[0]].isin([3,5])
df.loc[m1 & m2, cols] = 0
输出:
c1 c2 st mt ast sr c7 c8
0 a a 2 1 4 2 a a
1 b b 0 0 0 0 b b
2 c c 1 1 2 4 c c
3 d d 3 3 1 2 d d
4 e e 2 3 2 1 e e
5 f f 0 0 0 0 f f