【问题标题】:pandas grouped list aggregation using transform fails with key error使用转换的熊猫分组列表聚合失败并出现键错误
【发布时间】:2021-03-07 04:20:30
【问题描述】:

如何将list 函数应用于未使用apply 而是使用transform 聚合的分组pandas dataframe

对我来说,以下失败:KeyError: "None of [Index(['v1', 'v2'], dtype='object')] are in the [index]"

import pandas as pd
df = pd.DataFrame({'key':[1,1,1,2,3,2], 'v1': [1,4,6,7,4,9], 'v2':[0.3, 0.6, 0.4, .1, .2, .8]})
display(df)

def list_function(x):
    #display(x)
    all_values = x[['v1','v2']].drop_duplicates()
    #display(all_values)
    #result = all_values.to_json()
    result = all_values.values
    return result


display(df.groupby(['key']).apply(list_function))
df['list_result'] = df.groupby(['key']).transform(list_function)
df

注意:我知道聚合数据可以进行联接,但在这种特殊情况下,我不希望之后再进行联接。

【问题讨论】:

    标签: python pandas list pandas-groupby


    【解决方案1】:

    这是不可能的,在 pandas GroupBy.transformGroupBy.agg 中分别处理每一列,所以不能像你需要的那样通过多个列名进行选择。

    只有GroupBy.apply才有可能。

    所以transform 可以改用Series.map,如果匹配一列,多列使用DataFrame.join

    df['list_result'] = df['key'].map(df.groupby(['key']).apply(list_function))
    print (df)
    
       key  v1   v2                           list_result
    0    1   1  0.3  [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
    1    1   4  0.6  [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
    2    1   6  0.4  [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
    3    2   7  0.1              [[7.0, 0.1], [9.0, 0.8]]
    4    3   4  0.2                          [[4.0, 0.2]]
    5    2   9  0.8              [[7.0, 0.1], [9.0, 0.8]]
    

    #added one column for match by 2 columns sample
    df['new'] = 1
    
    s = df.groupby(['key', 'new']).apply(list_function)
    df = df.join(s.rename('list_result'), on=['key','new'])
    print (df)
       key  v1   v2  new                           list_result
    0    1   1  0.3    1  [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
    1    1   4  0.6    1  [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
    2    1   6  0.4    1  [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
    3    2   7  0.1    1              [[7.0, 0.1], [9.0, 0.8]]
    4    3   4  0.2    1                          [[4.0, 0.2]]
    5    2   9  0.8    1              [[7.0, 0.1], [9.0, 0.8]]
    

    【讨论】:

    • 这样更好!太好了。
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 2021-12-14
    • 2021-04-17
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2016-12-06
    • 2018-12-29
    相关资源
    最近更新 更多