熊猫:如何通过一组序数值对数据框进行分组?

时间:2017-04-05 14:39:29

标签: pandas matplotlib group-by

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

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

enter image description here

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

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

现在我想用垃圾和健康食品消费的演变绘制图表。我相信我必须处理我的数据以获得如下的DataFrame:

enter image description here

假设第一个表已经在名为food的数据帧中,如何将其转换为第二个?

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

1 个答案:

答案 0 :(得分:4)

首先使用列表创建dictinary,然后将keysvalues交换。

然后groupbyfooddict映射列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