假设我们具有以下数据框:
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。
如何制定索引的条件?预先感谢!
答案 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)
您可以通过loc
和iloc
运算符访问索引。
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