首页 > 解决方案 > 如果python中的行总和为零,则用字符串替换单元格:循环dfs列表时无法按预期工作

问题描述

我有一个命令可以替换单行中的所有列,其中整行仅包含零或 nan。如果我将它作为单个数据帧的命令执行,它会起作用,但是当我在数据帧列表上循环它并给出错误的输出时,行为会发生变化。我不明白为什么会这样,或者如何解决它。一些数据和示例代码如下。任何建议都会非常棒。非常感谢

数据框:

df1 = pd.DataFrame(data={'x':['a','b','c','d'],'a': [np.nan, 2, 0, np.nan], 'b': [np.nan,2,np.nan, np.nan], 'c': [np.nan,1,0, np.nan]})
df2 = pd.DataFrame(data={'x':['a','b','c','d'],'a': [np.nan, 2, 0, np.nan], 'b': [0,2,4, np.nan], 'c': [0,1,0, np.nan]})

它给出了以下数据框

df1
   x    a    b    c
0  a  NaN  NaN  NaN
1  b  2.0  2.0  1.0
2  c  0.0  NaN  0.0
3  d  NaN  NaN  NaN

df2
   x    a    b    c
0  a  NaN  0.0  0.0
1  b  2.0  2.0  1.0
2  c  0.0  4.0  0.0
3  d  NaN  NaN  NaN

此命令将在单个数据帧上运行并提供以下输出

df1.loc[~df1.fillna(0).ne(0).all(axis=1), df1.columns != 'x'] = 'test'

      x     a     b     c
0     a  test  test  test
1     b   2.0   2.0   1.0
2     c  test  test  test
3     d  test  test  test

但是如果我这样循环它,那么输出不正确,第二个数据帧只是第一个数据帧的副本

dfs = [df1, df2]

for i in range(len(dfs)):
    dfs[i].loc[~dfs[i].fillna(0).ne(0).all(axis=1), dfs[i].columns != 'x'] = 'test'

我得到的输出

[   x     a     b     c
 0  a  test  test  test
 1  b   2.0   2.0   1.0
 2  c  test  test  test
 3  d  test  test  test,
    x     a     b     c
 0  a  test  test  test
 1  b   2.0   2.0   1.0
 2  c  test  test  test
 3  d  test  test  test]

标签: pythonpandasdataframe

解决方案


你必须在你的条件之前“定位”。选择行和列是两个独立的操作:

dfs = [df1, df2]
for df in dfs:
    df.loc[df.loc[:, df.columns != 'x'].fillna(0).eq(0).all(axis=1),
           df.columns != 'x'] = 'test'
>>> df1
   x     a     b     c
0  a  test  test  test
1  b   2.0   2.0   1.0
2  c  test  test  test
3  d  test  test  test

>>> df2
   x     a     b     c
0  a  test  test  test
1  b   2.0   2.0   1.0
2  c   0.0   4.0   0.0
3  d  test  test  test

推荐阅读