熊猫:根据列和索引的条件选择行

时间:2020-01-18 14:37:09

标签: python pandas dataframe select

假设我们具有以下数据框:

d = {'col1': ['a1', 'b1', 'c1', 'a1'], 'col2': ['a2', 'b2', 'b2', 'c2'], 'year':[2011, 2011, 2012, 2012], 'rank':[1, 2, 1, 2]}
df = pd.DataFrame(data=d).set_index(['year', 'rank']).sort_index()

          col1 col2
year rank          
2011 1      a1   a2
     2      b1   b2
2012 1      c1   b2
     2      a1   c2

如何选择col1 != 'a1'year != 2011的所有列?

如果year不是索引,我可以通过

df[(df.col1 != 'a1') | (df.year != 2011)]

但是,由于年份是索引,df.year将引发AttributeError。

如何制定索引的条件?预先感谢!

4 个答案:

答案 0 :(得分:2)

您可以使用df.index.get_level_values方法访问索引,例如您可以通过

获得搜索结果
In [29]: df[(df.col1 != 'a1') | (df.index.get_level_values('year') != 2011)]
Out[29]:
          col1 col2
year rank
2011 2      b1   b2
2012 1      c1   b2
     2      a1   c2

一些旁注:

比较df.index.get_level_values('year') != 2011将是一个numpy数组,因此我们需要从pd.Series获取值以与df.col1 != 'a1'进行比较(在某些较早的熊猫版本中,您可能曾经使用过之所以用.values或类似值表示,是因为无法将带有索引的序列与某个数组进行比较。Howewer,至少在0.24及更高的水平上不再需要)。

答案 1 :(得分:1)

您可以使用方法query()将框架的索引和列都视为一列:

df.query("col1 != 'a1' | year != 2011")

输出:

          col1 col2
year rank          
2011 2      b1   b2
2012 1      c1   b2
     2      a1   c2

答案 2 :(得分:0)

您可以通过lociloc运算符访问索引。

df[df['col1'] != 'a1'].loc[2011]

要同时访问年份索引和排名索引,df.loc[2011,1]将输出a1 and a2

答案 3 :(得分:0)

您可以尝试

df1 = df[df.index.get_level_values('year').isin([2011])]
df2 = df[df.col1 == 'a1']
result = pd.concat([df1,df2]).drop_duplicates()

输出

        col1    col2
year    rank        
2011    1   a1  a2
        2   b1  b2
2012    2   a1  c2