我有这个数据框,如果整行等于 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)
您可以将比较列的掩码传递给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)