合并并汇总熊猫行

时间:2020-10-02 15:46:07

标签: python python-3.x pandas

我有一个看起来像这样的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,然后对其进行分组;有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

正如Manakin所说,您需要手动对商品进行分类。

使用itemcategory对构建映射字典,并将其传递给series.mapseries.replace

map将更改字典中的所有项目,否则填充NaNreplace将查找并替换所有匹配项并替换它们,但是将不将其保留在字典键中(例如,如果数据框包含'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()