选择熊猫多索引组中的第一个子组



我有一个具有 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_valuesIndex.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

最新更新