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

时间:2020-06-22 11:42:29

标签: python python-3.x pandas pandas-groupby

我有一个带有2级索引的pandas数据框。对于每个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个记录)。

我调查了很多代码,但仍然无法找到答案。有简单的方法吗?

1 个答案:

答案 0 :(得分:3)

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