【问题标题】:Pandas - Dataframe has column with lists. How can I groupby the elements within the list?Pandas - Dataframe 有包含列表的列。如何按列表中的元素分组?
【发布时间】:2020-01-07 16:30:00
【问题描述】:

我有一个数据框,其中一些单元格包含多个值的列表,如下所示:

import pandas as pd

df = pd.DataFrame(
    {'category': [[x,y,z],[x],[y,z],[x,z]]
     'value': [20,30,20,10]
    }
)

df

Out[10]: 
     category  value
0    [x, y, z] 20
1    [x]       30
2    [y, z]    20
3    [x, z]    10

我想按 category 列中的唯一元素对数据进行分组,并捕获每个元素的计数和该元素所在的 value 的平均值。

预期输出应如下所示:

     count  mean
x    3      20
y    2      20
z    3      16.7

我比较熟悉简单的 groupby 函数,并且能够创建一个独特元素的平面列表(即 [x,y,z])。但是,我不确定如何使用该平面列表按上述要求转换数据。非常感谢您的帮助!

【问题讨论】:

  • 你能解释一下为什么最后一个平均值是 18.5
  • 我的错误。键盘上的手指很滑。相应更新

标签: python pandas dataframe pandas-groupby


【解决方案1】:

使用(explode for pandas 0.25+):

df.explode('category').groupby('category')['value'].agg(['count','mean'])

          count       mean
category                  
x             3  20.000000
y             2  20.000000
z             3  16.666667

对于0.25以下的pandas版本:

(df.loc[df.index.repeat(df['category'].str.len()),['value']]
  .assign(category=np.concatenate(df['category']))
 .groupby('category')['value'].agg(['count','mean']))

          count       mean
category                  
x             3  20.000000
y             2  20.000000
z             3  16.666667

【讨论】:

  • @aws_apprentice 感谢您的提示,在答案中进行了编辑(如果没有,我建议升级:) 不过,再次感谢)
  • 有时升级不是一种选择,不幸的是,StackOverflow 上定义明确、自包含的问题与现实世界相去甚远
  • @aws_apprentice 嗯。在这种情况下,我已经更新了我的答案
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2018-09-02
相关资源
最近更新 更多