Skip to main content
 首页 » 编程设计

python之Pandas 数据帧 : How to neatly select data based on value in particular column

2025年05月04日11itcoder

对于 DataFrame,我想根据某些列的值来选择行,例如对于数据框:

import pandas as pd 
 
d = {'category': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'], 
     'colour': ['red', 'blue', 'green', 'orange', 'red', 'blue', 'green', 'orange', 'red', 'blue', 'green', 'orange'], 
     'amount': [28.1, 5.6, 43.6, 13.3, 4.1, 27.6, 19.7, 37.5, 26.7, 73.7, 94.4, 77.5], 
     'scalar': [3.4, 2.8, 3.4, 1.7, 2.2, 0.8, 1.9, 0.3, 2.4, 0.2, 0.5, 1.5]} 
df = pd.DataFrame(d) 

结果是:

   category  colour  amount  scalar 
0         a     red    28.1     3.4 
1         a    blue     5.6     2.8 
2         a   green    43.6     3.4 
3         a  orange    13.3     1.7 
4         b     red     4.1     2.2 
5         b    blue    27.6     0.8 
6         b   green    19.7     1.9 
7         b  orange    37.5     0.3 
8         c     red    26.7     2.4 
9         c    blue    73.7     0.2 
10        c   green    94.4     0.5 
11        c  orange    77.5     1.5 

要根据 column 中的 value 选择行,我一直在使用 df[df[column]==value],例如:

df[df['category']=='b'] 
  category  colour  amount  scalar 
4        b     red     4.1     2.2 
5        b    blue    27.6     0.8 
6        b   green    19.7     1.9 
7        b  orange    37.5     0.3 

这在我的工作中是一个非常常见的操作,所以是否有某种函数可以在不那么困惑的情况下执行此操作(尤其是 column 和 value 可以自己是更长的单词或计算)。

我认为这将采用 df.mask_for(column, value) 的形式,例如:

df.mask_for('category', 'b') 
  category  colour  amount  scalar 
4        b     red     4.1     2.2 
5        b    blue    27.6     0.8 
6        b   green    19.7     1.9 
7        b  orange    37.5     0.3 

pandas.DataFrame.where() 和 pandas.DataFrame.mask() 似乎没有实现这一点。

如果它始终是您引用的同一列,您可以将其设置为索引并使用 .loc,例如:

df.set_index('category').loc['b',:] 
          colour  amount  scalar 
category                         
b            red     4.1     2.2 
b           blue    27.6     0.8 
b          green    19.7     1.9 
b         orange    37.5     0.3 

但是如果您在许多不同的列上执行此操作,或者正在使用其他内容作为索引,那么一直设置/重置索引似乎有点笨拙。一般情况是否有类似的东西?

谢谢!

请您参考如下方法:

您可以使用查询功能作为替代。

df.query('"category" == "b"') 

您也可以编写自己的函数,这样您以后就可以省去按键操作了。

def mask_for(df,column,value): 
    return(df.loc[df[column]==value]) 
 
mask_for(df,'category','b')