【问题标题】:Pandas Dataframe Aggregation熊猫数据框聚合
【发布时间】:2022-01-21 11:03:22
【问题描述】:

我有以下数据框(我没有在这里包含索引,但显然还有一个索引)

ID_1 ID_2 Count
55 62 1000
62 55 1200
... ... ...

现在我想聚合这两列,因为我不关心 ID 是在 ID_1 列还是 ID_2 列中。

我想得到以下结果:

ID_1 ID_2 Count
55 62 2200
62 55 2200
... ... ...

这意味着我想对数据框中两个 ID 相同的所有行的 Count 列求和(不管它们是在 ID_1 列还是 ID_2 列中)。

我曾考虑对数据框进行分组,但效果不佳。

我很乐意为您提供任何帮助!

【问题讨论】:

    标签: python pandas dataframe pandas-groupby aggregation


    【解决方案1】:

    创建虚拟组:

    make_group = lambda x: tuple(sorted(x))
    
    df['Count'] = df.groupby(df[['ID_1', 'ID_2']].apply(make_group, axis=1))['Count'] \
                    .transform('sum')
    

    输出:

    >>> df
       ID_1  ID_2  Count
    0    55    62   2200
    1    62    55   2200
    
    # virtual groups
    >>> df[['ID_1', 'ID_2']].apply(make_group, axis=1)
    0    (55, 62)
    1    (55, 62)
    dtype: object
    

    【讨论】:

    • 提示:我同意这种方法,但是对于较大的数据集,这会变慢。
    【解决方案2】:

    按行对 ID 列进行排序

    df[['ID_1', 'ID_2']] = np.sort(df[['ID_1', 'ID_2']], axis=1)
    

    现在按 ID 列分组

    df.groupby(['ID_1', 'ID_2']).transform(sum)
    

    【讨论】:

      【解决方案3】:

      使用 np.sort 、 groupby 和聚合对行值进行排序。代码如下

      df=df.assign(Count=pd.DataFrame(np.sort(df.values), columns=df.columns).groupby(['ID_1','ID_2']).transform('sum'))
      

      或者使用 agg('sort') 进行排序,然后按 groupby 进行排序

      df[df.filter(regex='^ID').columns] =df.filter(regex='^ID').agg('sort')
      df['Count']=df.groupby(['ID_1','ID_2']).transform('sum')
      
      
      
          ID_1  ID_2  Count
      0    55    62   2200
      1    62    55   2200
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 2019-08-02
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 2017-04-01
        • 2022-12-16
        相关资源
        最近更新 更多