我以这种方式拥有一个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中编码。任何帮助将不胜感激。
答案 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()