python - 如果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]
解决方案
你必须在你的条件之前“定位”。选择行和列是两个独立的操作:
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
推荐阅读
- javascript - Javascript、jQuery、Json 和 Ajax 中的依赖下拉列表
- node.js - 在 Express 中的 DB.query 之后重定向
- c++ - C++ 返回一个赋值?
- python - 散列方法实现不适用于 set() [Python]
- javascript - 在 Heroku 上的 vanilla JS 中使用配置变量(使用 PHP 后端解决方法)
- vim - 如何在不选择回车符的情况下选择标签之间的文本(
) 在 vim 中? - typescript - 如何将方法的签名复制到另一个方法?
- c - 我有一个函数读取文件,但它无法读取任何内容
- java - java中单向关闭时,为什么套接字会被视为关闭?
- javascript - 如何使用 js if 语句添加 html 代码?