基于过滤器在pandas DataFrame中创建新列

1 python dataframe pandas

鉴于此DataFrame:

df = pandas.DataFrame({"a": [1,10,20,3,10], "b": [50,60,55,0,0], "c": [1,30,1,0,0]})
Run Code Online (Sandbox Code Playgroud)

是什么力量让一个新的列,"过滤器"具有价值的最佳途径"合格",如果在列中的值ab均小于X和值"不及格",否则?

它可以通过遍历行来完成,但它效率低且不够优雅:

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
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 6

一种方法是创建一个布尔值列,如下所示:

>>> 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
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令将布尔值更改为"pass"或"fail" replace:

>>> df['filter'].astype(object).replace({False: 'fail', True: 'pass'})
0    fail
1    fail
2    pass
3    fail
4    fail
Run Code Online (Sandbox Code Playgroud)

您可以使用将其扩展到更多列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
Run Code Online (Sandbox Code Playgroud)

使用all此DataFrame的第1轴创建新列:

>>> (df[cols] > 0).all(axis=1)
0     True
1     True
2     True
3    False
4    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)