【问题标题】:Group lists of different rows by multiple columns values with Pandas使用 Pandas 按多列值对不同行的列表进行分组
【发布时间】:2017-06-18 13:02:07
【问题描述】:

我有一个这样的数据框df1

import pandas as pd
dic = {'A':[0,0,2,2,2,1,5,5],'B':[[1,5,3,8],[1,8,7,5],[7,8,9,5],[3],[1,5,9,3],[0,3,5],[],[4,2,3,1]],'C':['a','b','c','c','d','e','f','f'],'D':['0','8','7','6','4','5','2','2']}
df1 = pd.DataFrame(dic)

看起来像这样:

#Initial dataframe 
   A             B  C  D
0  0  [1, 5, 3, 8]  a  0
1  0  [1, 8, 7, 5]  b  8
2  2  [7, 8, 9, 5]  c  7
3  2           [3]  c  6
4  2  [1, 5, 9, 3]  d  4
5  1     [0, 3, 5]  e  5
6  5            []  f  2
7  5  [4, 2, 3, 1]  f  2

我的目标是将AC 列中具有相同值的行分组,并合并B 列的内容,结果如下所示:

#My GOAL
   A                B  C
0  0     [1, 5, 3, 8]  a
1  0     [1, 8, 7, 5]  b
2  2  [3, 7, 8, 9, 5]  c
3  2     [1, 5, 9, 3]  d
4  1        [0, 3, 5]  e
5  5     [4, 2, 3, 1]  f

如您所见,AC 列中具有相同项目的行被合并,而如果至少有一个不同,则它们保持原样。 我的想法是像这样使用groupbysum 函数:

df1.groupby(by=['A','C'],as_index=False,sort=True).sum()

但 Python 返回错误消息:Function does not reduce

你能告诉我我的代码行有什么问题吗?为了实现我的目标,我应该写什么?

注意:我不关心可以丢弃的列 D 会发生什么。

【问题讨论】:

    标签: python pandas dataframe group-by sum


    【解决方案1】:

    其中一种可能性是在 itertools.chain(*iterables) 的帮助下将列表中的 list 展平,直到用尽为止

    import itertools
    df1.groupby(['A', 'C'])['B'].apply(lambda x: list(itertools.chain(*x))).reset_index()
    

    (或)

    sumlambda 一起使用:

    df1.groupby(by=['A','C'])['B'].apply(lambda x: x.sum()).reset_index()
    

    两者都有:

    默认情况下,groupby().sum() 会查找数值类型(标量)值来执行聚合,而不是像 list 这样的元素集合。

    【讨论】:

      【解决方案2】:

      另一种可能性:

      df1.groupby(by=['A','C'],as_index=False,sort=True).agg({'B': lambda x: tuple(sum(x, []))})
      

      结果:

         A  C                B
      0  0  a     (1, 5, 3, 8)
      1  0  b     (1, 8, 7, 5)
      2  1  e        (0, 3, 5)
      3  2  c  (7, 8, 9, 5, 3)
      4  2  d     (1, 5, 9, 3)
      5  5  f     (4, 2, 3, 1)
      

      基于this answer(列表似乎不太适合聚合)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 2021-11-16
        • 2017-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多