我开始学习Python Pandas ,并希望生成一个包含序数值的任意分组总和的图表。用一个简单的例子可以更好地解释它。
假设我有以下食物消费数据表:
我将两组食物定义为两个列表:
healthy = ['apple', 'brocolli']
junk = ['cheetos', 'coke']
现在我想用垃圾和健康食品消费的演变绘制图表。我相信我必须处理我的数据以获得如下的DataFrame:
假设第一个表已经在名为food
的数据帧中,如何将其转换为第二个?
我也欢迎建议改写我的问题以使其更清楚,或者采用不同的方法来生成情节。
答案 0 :(得分:4)
首先使用列表创建dictinary
,然后将keys
与values
交换。
然后groupby
按food
和dict
映射列year
,汇总sum
并按unstack
重新整理:
healthy = ['apple', 'brocolli']
junk = ['cheetos', 'coke']
d1 = {'healthy':healthy, 'junk':junk}
##http://stackoverflow.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