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

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

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

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

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

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

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

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

【问题讨论】:

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

标签: pandas matplotlib group-by


【解决方案1】:

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

然后groupby 通过映射列food 通过dictyear,聚合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

【讨论】:

  • 今晚早点睡觉...玩得开心:-)
  • 是的,昨天很疯狂;)晚安;)
  • 谢谢,我喜欢数据透视表。这是一个很好的理解指南:nikgrozev.com/2015/07/01/…
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2022-01-22
  • 2023-03-08
  • 2021-11-25
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多