Pandas:如何按一组序数值对数据框进行分组?

Posted

技术标签:

【中文标题】Pandas:如何按一组序数值对数据框进行分组?【英文标题】:Pandas: how do I group a Data Frame by a set of ordinal values? 【发布时间】:2017-08-31 06:09:11 【问题描述】:

我开始学习 Python Pandas,并希望生成一个包含任意序数值的任意分组总和的图表。用一个简单的例子可以更好地解释。

假设我有下表的食物消费数据:

我将两组食物定义为两个列表:

healthy = ['apple', 'brocolli']
junk = ['cheetos', 'coke']

现在我想绘制一张关于垃圾食品和健康食品消费演变的图表。我相信我必须处理我的数据以获得像这样的 DataFrame:

假设第一个表已经在一个名为 food 的 Dataframe 中,我如何转换它以获得第二个?

我也欢迎提出建议来改写我的问题以使其更清晰,或者使用不同的方法来生成情节。

【问题讨论】:

请不要张贴数据图片,因为many reasons,这意味着任何想用您的数据展示工作示例的人都必须手动输入。 @DSM:吸取的教训。谢谢! 【参考方案1】:

首先用列表创建dictinary,然后用values交换keys

然后groupby 通过映射列food 通过dictyear,聚合sum,最后通过unstack 重塑:

healthy = ['apple', 'brocolli']
junk = ['cheetos', 'coke']

d1 = 'healthy':healthy, 'junk':junk
##http://***.com/a/31674731/2901002
d = k: oldk for oldk, oldv in d1.items() for k in oldv
print (d)
'brocolli': 'healthy', 'cheetos': 'junk', 'apple': 'healthy', 'coke': 'junk'

df1 = df.groupby([df.food.map(d), 'year'])['amount'].sum().unstack(0)
print (df1)
food  healthy  junk
year               
2010       10    11
2011       17    10
2012       13    24

pivot_table 的另一种解决方案:

df1 = df.pivot_table(index='year', columns=df.food.map(d), values='amount', aggfunc='sum')
print (df1)
food  healthy  junk
year               
2010       10    11
2011       17    10
2012       13    24

【讨论】:

今晚早点睡觉...玩得开心:-) 是的,昨天很疯狂;)晚安;) 谢谢,我喜欢数据透视表。这是一个很好的理解指南:nikgrozev.com/2015/07/01/…

以上是关于Pandas:如何按一组序数值对数据框进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何按id python按一列顺序对两列进行分组[重复]

pandas如何对value列数据进行分组groupby?

Azure Cosmos DB 如何按一系列值进行分组

python--pandas分组聚合

Python Pandas:按一列分组,仅在另一列中聚合,但取相应数据

如何通过对多个变量进行分组来创建新的 pandas 数据框?