我有一个看起来像这样的Pandas数据框:
date item amount
201901 Apple 1.03
201901 Potato 1.04
201901 Orange 1.00
我正在尝试按月查找水果和蔬菜的销量:
date item amount
201901 Fruit 2.03
201901 Vegetables 1.04
执行此操作的最佳方法是什么?我对df.groupby(['date','item'])['amount'].sum()
很熟悉,但这并不会有条件地将水果和蔬菜结合在一起。
一种方法是根据type
中的值创建另一列item
,然后对其进行分组;有更好的方法吗?
答案 0 :(得分:1)
正如Manakin所说,您需要手动对商品进行分类。
使用item
:category
对构建映射字典,并将其传递给series.map
或series.replace
。
map
将更改字典中的所有项目,否则填充NaN
。 replace
将查找并替换所有匹配项并替换它们,但是将不将其保留在字典键中(例如,如果数据框包含'brussel sprouts'
但该键不在字典中,则它将)将其保留为商品名称)。由您决定所需的行为。
下面是一个series.map
的示例:
categories = {'Apple': 'Fruit', 'Potato': 'Vegetable', 'Orange': 'Fruit'}
df['category'] = df['item'].map(categories)
summary = df.groupby(['date', 'category'])['amount'].sum().reset_index()
print(summary)
输出
date category amount
0 201901 Fruit 2.03
1 201901 Vegetable 1.04
答案 1 :(得分:0)
您可能应该有2张清单或字典,其中列出了您认为是水果或蔬菜的内容,但是当您这样做时...
mapping = {'Apple': 'Fruit', 'Potato': 'Vegetable', 'Orange': 'Fruit'}
这可以为您提供您想要的内容,而无需添加列,从而可以即时计算分组:
def grouper(row):
return row['Item']
group_earnings = (df.groupby(grouper))['amount'].sum().reset_index()