【问题标题】:Select the first subgroup in Pandas multi-index group选择 Pandas 多索引组中的第一个子组
【发布时间】:2020-06-22 11:42:29
【问题描述】:

我有一个带有 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 条),第 2 个人的 2019 年记录(第 2 条)和第 3 个人的 2019 年记录(第 1 条记录)。

我查看了很多代码,仍然无法得到答案。有没有简单的方法?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 干得漂亮!今天学习了 df.index.isin(index ..) :)
    猜你喜欢
    • 2019-02-08
    • 2020-09-05
    • 2020-12-21
    • 2018-08-26
    • 2019-01-24
    • 2018-02-03
    • 2017-08-27
    • 2021-10-24
    相关资源
    最近更新 更多