代码之家  ›  专栏  ›  技术社区  ›  Anakin Skywalker

修复列名并在将数据框按两列分组后重命名

  •  0
  • Anakin Skywalker  · 技术社区  · 3 年前

    我有一个数据帧:

    {'ARTICLE_ID': {0: 111, 1: 111, 2: 222, 3: 222, 4: 222}, 'CITEDIN_ARTICLE_ID': {0: 11, 1: 11, 2: 11, 3: 22, 4: 22}, 'enrollment': {0: 10, 1: 10, 2: 10, 3: 10, 4: 10}, 'Trial_year': {0: 2017, 1: 2017, 2: 2017, 3: 2017, 4: 2017}, 'AUTHOR_ID': {0: 'aaa', 1: 'aaa', 2: 'aaa', 3: 'aaa', 4: 'aaa'}, 'AUTHOR_RANK': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}}
    

    我把它分成两列

    df_grouped = df.groupby(['AUTHOR_ID', 'Trial_year']).agg({'ARTICLE_ID': "count", 
                                                          'enrollment': ["count", 'sum']}).reset_index()
    

    因此,我收到了这个数据框,其中列名有两个级别

    {('AUTHOR_ID', ''): {0: 'aaa'}, ('Trial_year', ''): {0: 2017}, ('ARTICLE_ID', 'count'): {0: 5}, ('enrollment', 'count'): {0: 5}, ('enrollment', 'sum'): {0: 50}}
    

    我的理想输出——具有一级列名和重命名列名的数据帧

    `AUTHOR_ID`, `Trial_year`, `ARTICLE_ID_count`, `enrollment_count`, `enrollment_sum`
         
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   enke    3 年前

    您可以修改以下列:

    df_grouped.columns = [f"{i}_{j}" if j!='' else i for i,j in df_grouped.columns]
    

    或使用 NamedAgg 从一开始:

    df_grouped = (df.groupby(['AUTHOR_ID', 'Trial_year'])
                  .agg(ARTICLE_ID_count=('ARTICLE_ID', "count"), 
                       enrollment_count=('enrollment','count'),
                       enrollment_sum=('enrollment','sum')).reset_index())
    

    你也可以把字典传给我 groupby.agg 要了解一些简洁的代码:

    df_grouped = (df.groupby(['AUTHOR_ID', 'Trial_year'], as_index=False)
                  .agg(**{'_'.join(pair): pair for pair in [('ARTICLE_ID', 'count'), 
                                                            ('enrollment','count'), 
                                                            ('enrollment','sum')]}))
    

    输出:

      AUTHOR_ID  Trial_year  ARTICLE_ID_count  enrollment_count  enrollment_sum
    0       aaa        2017                 5                 5              50