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
通过dict
和year
,聚合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:如何按一组序数值对数据框进行分组?的主要内容,如果未能解决你的问题,请参考以下文章