给定这个 DataFrame:
df = pandas.DataFrame({"a": [1,10,20,3,10], "b": [50,60,55,0,0], "c": [1,30,1,0,0]})
如果 a 和 b 列的值都大于 x,那么创建一个新列的最佳方法是什么?“过滤器”的值为“pass”否则值“失败”?
它可以通过遍历行来完成,但效率低下且不够优雅:
c = []
for x, v in df.iterrows():
if v["a"] >= 20 and v["b"] >= 20:
c.append("pass")
else:
c.append("fail")
df["filter"] = c
请您参考如下方法:
一种方法是像这样创建一列 bool 值:
>>> df['filter'] = (df['a'] >= 20) & (df['b'] >= 20)
a b c filter
0 1 50 1 False
1 10 60 30 False
2 20 55 1 True
3 3 0 0 False
4 10 0 0 False
然后您可以使用 replace 将 bool 值更改为“通过”或“失败”:
>>> df['filter'].astype(object).replace({False: 'fail', True: 'pass'})
0 fail
1 fail
2 pass
3 fail
4 fail
您可以使用 all 将其扩展到更多列。例如,要跨列查找条目大于 0 的行:
>>> cols = ['a', 'b', 'c'] # a list of columns to test
>>> df[cols] > 0
a b c
0 True True True
1 True True True
2 True True True
3 True False False
4 True False False
在此 DataFrame 的轴 1 上使用 all 创建新列:
>>> (df[cols] > 0).all(axis=1)
0 True
1 True
2 True
3 False
4 False
dtype: bool
