【问题标题】:pandas groupby: aggregating lists with a tuple indexpandas groupby:使用元组索引聚合列表
【发布时间】:2017-06-23 14:37:39
【问题描述】:

这个问题类似于here 提出的问题,但有一个元组索引。 将一列列表分组适用于单个索引:

mydata = [{'idx': 'A', 'list_str': ['hi', 'babe']},
          {'idx': 'A', 'list_str': ['take', 'a', 'walk']},
          {'idx': 'A', 'list_str': []},
          {'idx': 'B', 'list_str': ['on', 'the', 'wild', 'side']}]


df = pd.DataFrame(mydata)
grouped = df.groupby('idx') 
print(grouped.agg({'list_str': lambda x: tuple(x)}))

预期输出:

idx     list_str
A       [hi, babe, take, a, walk]
B       [on, the, wild, side]

但是,添加第二个索引不再起作用:

mydata = [{'idx': 'A', 'idx2': 'B', 'list_str': ['hi', 'babe']},
          {'idx': 'A', 'idx2': 'B', 'list_str': ['take', 'a', 'walk']},
          {'idx': 'A', 'idx2': 'B', 'list_str': []},
          {'idx': 'B', 'idx2': 'C', 'list_str': ['on', 'the', 'wild', 'side']}]

df = pd.DataFrame(mydata)
grouped = df.groupby(('idx', 'idx2'))
print(grouped.agg({'list_str': sum}))

给出ValueError、Function does not reduce。

这样做的正确方法是什么?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    要按多列分组,请使用列表:

    grouped = df.groupby(['idx', 'idx2'])
    print(grouped.agg({'list_str': sum}))
    

    可能你以为你在做:

    df['new_index'] = df.apply(lambda row: (row['idx'],row['idx2']), axis=1)
    df.set_index('new_index',inplace=True)
    
    grouped = df.groupby(df.index)
    print(grouped.agg({'list_str': sum}))
    

    【讨论】:

    • 你试过代码了吗?这实际上给出了完全相同的错误。
    • 我确实尝试过,完全使用您提供的输入。您是否在 groupby 调用中使用了列表 [] 而不是元组 ()?还是您的输入数据构造错误,因为它有两个单独的索引而不是一个元组索引?
    • 使用相同的 'mydata' 变量,df = pd.DataFrame(mydata); grouped = df.groupby(['idx', 'idx2']); print(grouped.agg({'list_str': sum})) 使用 pandas 版本 0.19.2 时会出现相同的错误。
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2019-10-12
    相关资源
    最近更新 更多