Skip to main content
 首页 » 编程设计

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

2025年05月04日14grandyang

给定这个 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