[英]Merge and Sum Pandas Rows
我有一个 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()
,但这不会有条件地结合水果和蔬菜。
一种方法是根据item
的值创建另一种列type
,然后对其进行分组; 有没有更好的办法?
正如 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
您可能应该有 2 个列表或字典,列出您认为是水果或蔬菜的内容,但是当您这样做时...
mapping = {'Apple': 'Fruit', 'Potato': 'Vegetable', 'Orange': 'Fruit'}
这可以为您提供所需的内容,而无需添加 column ,即时计算分组:
def grouper(row):
return row['Item']
group_earnings = (df.groupby(grouper))['amount'].sum().reset_index()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.