【问题标题】:Using Pandas groupby how can you aggregate a column of lists using addition?使用 Pandas groupby 如何使用加法聚合一列列表?
【发布时间】:2019-02-10 00:57:03
【问题描述】:

我有一个数据框,其中有一列包含值列表。数据框中的每一行都有一个相同长度的列表。我想使用 Dataframe.groupby 对数据框中的数据进行分组,并按以下方式将列表汇总在一起:

在:

import pandas as pd

#Sample data
a = pd.DataFrame([['a', 'test', list([0,1,2,3,4])],['b', 'test', list([5,6,7,8,9])]], columns=['id', 'grp', 'values'])
print(a)

#Some function to group the dataframe
#b = a.groupby('grp').someAggregationFunction()

#Example of desired output
b = pd.DataFrame([['test', list([5,7,9,11,13])]], columns=['grp', 'values'])
    print(b)

输出:

  id   grp           values
0  a  test  [0, 1, 2, 3, 4]
1  b  test  [5, 6, 7, 8, 9]

    grp             values
0  test  [5, 7, 9, 11, 13]

【问题讨论】:

    标签: python pandas numpy pandas-groupby


    【解决方案1】:

    一种解决方案是将transform 你的lists 转换为np.arrays 并使用简单的求和

    a['v'] = a.v.transform(np.array)
    a.groupby('grp').v.apply(lambda x: x.sum())
    
        grp     v
    0   test    [5, 7, 9, 11, 13]
    

    请注意,我将 values 更改为 v,以免与来自 pd.DataFrame.values 访问器混淆

    【讨论】:

      【解决方案2】:

      使用numpy.stack

      pd.DataFrame(
          [(i, np.stack(g).sum(0)) for i, g in a.groupby('grp')['values']],
          columns=['grp', 'values']
      )
      

          grp             values
      0  test  [5, 7, 9, 11, 13]
      

      同样使用apply,但apply会很慢:

      a.groupby('grp')['values'].apply(lambda x: np.stack(x).sum(0)).to_frame('values')
      

                       values
      grp
      test  [5, 7, 9, 11, 13]
      

      【讨论】:

        【解决方案3】:

        压成一行

        a.groupby('grp')['values'].apply(lambda x : pd.DataFrame(x.values.tolist()).sum().tolist())
        Out[286]: 
        grp
        test    [5, 7, 9, 11, 13]
        Name: values, dtype: object
        

        另外我建议不要在这里使用apply

        b=pd.DataFrame(a['values'].values.tolist()).groupby(a['grp']).sum()
        pd.DataFrame({'grp':b.index,'values':b.values.tolist()})
        Out[293]: 
            grp             values
        0  test  [5, 7, 9, 11, 13]
        

        【讨论】:

        • 了解 apply 的性能影响,但是对于我的实际实现来说,它是最合适的。感谢您的解决方案!
        【解决方案4】:

        您可能不喜欢这个答案,但最好不要在数据框中使用列表。您应该尽可能将数字系列用于数字数据:

        res = df.join(pd.DataFrame(df.pop('values').tolist()))\
                .groupby('grp').sum().reset_index()
        
        print(res)
        
            grp  0  1  2   3   4
        0  test  5  7  9  11  13
        

        【讨论】:

        • 这就是我推荐的 :-) 好兄弟
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 2019-01-26
        • 2020-10-17
        • 2020-11-05
        • 1970-01-01
        • 2019-06-05
        相关资源
        最近更新 更多