【问题标题】:Pandas groupby and aggregate over multiple listsPandas groupby 和聚合多个列表
【发布时间】:2020-11-05 10:42:02
【问题描述】:

我有一个数据框 df,有两列。我想按一列分组并通过获取“平均列表”(所有列表元素平均)来聚合属于同一组的列表,如下所示:

column_a, column_b
1,         [1,2,3]
1,         [2,5,1]
2,         [5,6,6]
3,         [2,0,1]
3,         [4,2,3]

列表始终具有相同的固定长度。所需的输出应如下所示:

group, avg_list
1,     [1.5,3.5,2]
2,     [5,6,6]
3,     [3,1,2]

我知道我可以在数据帧上使用 groupby 并随后对其进行聚合,但我不确定在代码的 agg 部分中放入什么。

df.groupby('column_a').agg(?)

如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: pandas list aggregate pandas-groupby average


    【解决方案1】:

    您可以通过这种方式获得每个组内列表的平均值:

    s = df.groupby("column_a")["column_b"].apply(lambda x: np.array(x.tolist()).mean(axis=0))
    
    pd.DataFrame({'group':s.index, 'avg_list':s.values})
    

    给予:

      group avg_list
    0   1   [1.5, 3.5, 2.0]
    1   2   [5.0, 6.0, 6.0]
    2   3   [3.0, 1.0, 2.0]
    

    【讨论】:

    • 非常感谢。这正是我所需要的。感谢您的帮助。
    • 我读入数据时有一个字符串列表。结果,我收到错误“TypeError: cannot perform reduce with flexible type ...所以我从np.array(x.tolist())更改为np.array(x.tolist()).astype(np.float)以解决。
    • 不错!我所做的是用literal_eval 转换列。这里df["column_b"] = df.column_b.apply(lambda s: list(ast.literal_eval(s))) 的这一行将从字符串转换为列表
    【解决方案2】:

    将它们组合成一个列表,然后使用均值求平均值。

    df.set_index('column_a')['column_b'].groupby('column_a').apply(list).apply(lambda x: np.mean(x,0))
    

    结果

    column_a
    1    [1.5, 3.5, 2.0]
    2    [5.0, 6.0, 6.0]
    3    [3.0, 1.0, 2.0]
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2019-10-12
      • 2023-03-07
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2017-07-02
      • 2017-07-20
      • 2020-11-04
      相关资源
      最近更新 更多