【问题标题】:pandas groupby aggregate element-wise list additionpandas groupby 聚合逐元素列表添加
【发布时间】:2019-01-26 08:13:35
【问题描述】:

我有一个如下所示的 pandas 数据框:

X                      Y
71455  [334.0,  319.0,  298.0,  323.0]
71455  [3.0,  8.0,  13.0,  10.0]
57674  [54.0,  114.0,  124.0,  103.0]

我想执行聚合groupby,它按元素添加存储在 Y 列中的列表。我试过的代码:

df.groupby('X').agg({'Y' : sum})   

结果如下:

                                                   Y
X                                                       
71455  [334.0,  319.0,  298.0,  323.0, 75.0,  55.0,  ...

所以它连接了列表,而不是按元素求和。然而,预期的结果是:

X                      Y
71455  [337.0,  327.0,  311.0,  333.0]
57674  [54.0,  114.0,  124.0,  103.0]

我尝试了不同的方法,但无法按预期工作。

【问题讨论】:

    标签: python list pandas aggregate pandas-groupby


    【解决方案1】:

    Pandas 并非设计用于一系列列表。这种尝试迫使 Pandas 使用无法以矢量化方式操作的object dtype 系列。相反,您可以在聚合之前将一系列列表拆分为数字系列:

    import pandas as pd
    
    df = pd.DataFrame({'X': [71455, 71455, 57674],
                       'Y': [[334.0, 319.0, 298.0, 323.0],
                             [3.0, 8.0, 13.0, 10.0],
                             [54.0, 114.0, 124.0, 103.0]]})
    
    df = df.join(pd.DataFrame(df.pop('Y').values.tolist()))
    
    res = df.groupby('X').sum().reset_index()
    
    print(res)
    
           X      0      1      2      3
    0  57674   54.0  114.0  124.0  103.0
    1  71455  337.0  327.0  311.0  333.0
    

    【讨论】:

    • df.pop('Y').values.tolist() 可以替换成列表(df.pop('Y'))
    • @ArcanistLupus,是的,它可以,但它一定更好吗?我相信 NumPy 数组 -> 直接列出非常有效。
    【解决方案2】:

    如果您将列表转换为 numpy 数组 sum 将起作用:

    df['Y'] = df['Y'].apply(np.array)
    
    df.groupby('X')['Y'].apply(np.sum)
    
    #X
    #57674     [54.0, 114.0, 124.0, 103.0]
    #71455    [337.0, 327.0, 311.0, 333.0]
    #Name: Y, dtype: object
    

    【讨论】:

    • 注意apply 效率低下,实际上是一个循环。不建议使用 Pandas。
    【解决方案3】:

    可以在分组数据帧上使用apply 来获得元素加法:

    df.groupby('X')['Y'].apply(lambda x: [sum(y) for y in zip(*x)])
    

    这会产生一个熊猫系列对象:

    X
    57674     [54.0, 114.0, 124.0, 103.0]
    71455    [337.0, 327.0, 311.0, 333.0]
    

    【讨论】:

    • 注意apply 效率低下,实际上是一个循环。不建议使用 Pandas。
    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 2020-11-05
    • 1970-01-01
    • 2021-11-01
    • 2019-10-12
    • 2017-07-02
    • 2017-07-20
    • 2017-06-07
    相关资源
    最近更新 更多