如果行在python中总和为零,则用字符串替换单元格

an1*_*0b3 1 python pandas

我有这个数据框,如果整行等于 0(仅包含 NaN 和或 0),我试图用字符串替换单元格。

我想对除第一列之外的所有列执行此操作,但我的循环不起作用,它将 df 中的所有值更改为“测试”。

df = pd.DataFrame(data={'a':['a','b','c','d'],'id': [np.nan, 2, 0, np.nan], 'id1': [np.nan,2,np.nan, np.nan], 'b': [np.nan,1,0, np.nan]})
Run Code Online (Sandbox Code Playgroud)
for col in df:
    if col != 'a':
        df[~df.sum(axis=1).ne(0)] = 'test'
Run Code Online (Sandbox Code Playgroud)

我想要的输出

   a    id   id1     b
0  a  test  test  test
1  b     2     2     1
2  c  test  test  test
3  d  test  test  test
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

您可以将比较列的掩码传递给DataFrame.loc

c = df.columns != 'a'
df.loc[~df.sum(axis=1).ne(0), c] = 'test'
print (df)
   a    id   id1     b
0  a  test  test  test
1  b   2.0   2.0   1.0
2  c  test  test  test
3  d  test  test  test
Run Code Online (Sandbox Code Playgroud)

就像@Mustafa Ayd?n 在评论中指出的那样,更安全的是通过0替换NaN来比较0

c = df.columns != 'a'
df.loc[~df.fillna(0).ne(0).all(axis=1), c] = 'test'
print (df)
   a    id   id1     b
0  a  test  test  test
1  b   2.0   2.0   1.0
2  c  test  test  test
3  d  test  test  test
Run Code Online (Sandbox Code Playgroud)

像这样工作:

c = df.columns != 'a'
df.loc[df.fillna(0).eq(0).any(axis=1), c] = 'test'
Run Code Online (Sandbox Code Playgroud)