过滤数据并替换 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