如何从具有一列的其他行的值之和的DataFrame中获取DataFrame?

时间:2018-11-15 14:17:16

标签: python pandas

我以这种方式拥有一个DataFrame:

        shop_id  item_price  item_cnt_day   day   month  year
        59       9.00        1.0            02    01     2013
        59       8.00        2.0            02    01     2013
        25       10.00       4.0            05    02     2013
        25       17.0        1.0            06    01     2013
        25       10.00       1.0            15    01     2013

然后我尝试获得如下DataFrame的结果:

        shop_id  all_revenue  month  year
        59       25.00        01     2013
        25       27.00        01     2013

我的意思是我想在2013年1月获得每家商店的收入。

但是,我不知道如何在Pandas中编码。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

eval + groupby + sum

您可以通过eval分配系列,然后使用groupby

res = df.eval('revenue=item_price * item_cnt_day')\
        .groupby(['shop_id', 'month', 'year'], as_index=False)['revenue'].sum()

您可以根据需要在2013年1月query(在上述操作之后的之前)

res = res.query('month == 1 & year == 2013')

print(res)

   shop_id  month  year  revenue
0       25      1  2013     27.0
2       59      1  2013     25.0

答案 1 :(得分:2)

我喜欢先过滤数据帧,以减少不必要的计算:

df.query('month == 1 and year == 2013')\
  .assign(all_revenue = df.item_price * df.item_cnt_day)\
  .groupby(['shop_id','month','year'], as_index=False)['all_revenue'].sum()

输出:

   shop_id  month  year  all_revenue
0       25      1  2013         27.0
1       59      1  2013         25.0

注意: :由于您的列名是“友好的”,没有空格或特殊字符,因此可以使用query方法。如果这对您的列命名不起作用,则需要使用布尔索引。

df[(df['month'] == 1) & (df['year'] == 2013)]\
  .assign(all_revenue = df.item_price * df.item_cnt_day)\
  .groupby(['shop_id','month','year'], as_index=False)['all_revenue'].sum()