首页 > 解决方案 > 通过多个条件选择行的惰性方式

问题描述

具有分类值的列的典型设置如下:

df = pd.DataFrame([('A', 'buy', 'sub'),
                  ('B', 'sell', 'prior'),
                  ('C', 'hold', 'sub'),
                  ('D', 'loan', 'none'),
                  ('A', 'hold', 'sub'),
                  ('A', 'buy', 'none')], columns=['name', 'action', 'class'])
    name     action   class
1    A          buy    sub
2    B          sell   prior    
3    C          hold   sub
4    D          loan   none
5    A          hold   sub
6    A          buy    none

假设我想从这个线程中选择具有多个条件的行,我可以这样做:

#selecting rows with name='A' AND action='buy'
df1 = df[(df['name']=='A') & (df['action']=='buy')]

#selecting rows with name='A' OR class='sub'
df2 = df[(df['name']=='A') | (df['class']=='sub')]

对于具有更多列和更多选择条件的数据框,上面的操作看起来很难看(即&and的长语句|)。我想做一些更紧凑的事情,像这样:

df1 = df[df[['name', 'action']] == ('A', 'buy')]
df2 = df[df[['name', 'class']] *** ('A', 'sub')]    *** is hybrid operator, maybe?

有什么懒惰的方法吗?如果没有这样的方式,请随时建议关闭此问题。谢谢。

标签: pythonpandas

解决方案


您可以为此使用 pandas 查询:

df.query('name == "A" and action=="buy"')

 name action class
0    A    buy   sub
5    A    buy  none

如果您确定要查询的列,您可以将它们移动到索引中并通过 MultiIndexing 进行选择:

df = df.set_index(['name', 'action'])
df = df.sort_index() # avoid performance issues 

df.loc(axis=0)['A', 'buy']
 
            class
name action      
A    buy      sub
     buy     none

推荐阅读