我有一个具有 2 级索引的熊猫数据帧。对于每个 1 级索引,我想选择第 1 级 2 级索引记录。
df = pd.DataFrame({'Person': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'Year': ['2020','2020', '2019','2019','2019','2018', '2019','2018','2017'],'class':list('AISAAIASS'),
'val': randint(0, 10, 9)})
df
Person Year class val
0 1 2020 A 8
1 1 2020 I 7
2 1 2019 S 6
3 2 2019 A 8
4 2 2019 A 1
5 2 2018 I 2
6 3 2019 A 0
7 3 2018 S 6
8 3 2017 S 8
我想要人员 1 的 2020(年(记录(2 个编号(,人员 2019 的记录(2 个编号(和人员 3 的 2019 年记录(1 个记录(。
我查看了很多代码,仍然无法得到答案。有没有简单的方法可以做到这一点?
将Index.get_level_values
与Index.duplicated
一起使用,作为第一个MultiIndex
值,然后按Index.isin
过滤:
np.random.seed(2020)
df = pd.DataFrame({'Person': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'Year': ['2020','2020', '2019','2019','2019','2018', '2019','2018','2017'],
'class':list('AISAAIASS'),
'val': np.random.randint(0, 10, 9)}).set_index(['Person','Year'])
<小时 />idx = df.index[~df.index.get_level_values(0).duplicated()]
df1 = df[df.index.isin(idx)]
或者按第一级GroupBy.head
获取第一个索引值:
df1 = df[df.index.isin(df.groupby(['Person']).head(1).index)]
<小时 />print (df1)
class val
Person Year
1 2020 A 0
2020 I 8
2 2019 A 6
2019 A 3
3 2019 A 7