pandas根据日期和项目类型进行统计

谢囧囧
  • 10
,date,code,name,cost
0,2019-02-01,SH,A,21
1,2019-02-01,SH,B,33
2,2019-02-01,SZ,C,44
3,2019-02-01,SZ,D,55
4,2019-02-01,Other,unused,100
5,2019-03-01,SH,A,21
6,2019-03-01,SH,B,22
7,2019-03-01,SZ,C,33
8,2019-03-01,SZ,D,22
9,2019-04-01,SH,A,121
10,2019-04-01,SH,B,522
11,2019-04-01,SZ,C,33
12,2019-04-01,SZ,D,22

image.png
1.统计每个时间段,name类别cost本期的占比。

2.统计每个时间段,code类别cost本期的占比。

思路:

1.通过groupby统计出cost合计形成一个新的表,通过date进行关联,计算出 cost_name_rate。

2.通过pivot_table,根据date和code统计出本期code的cost合计,形成新表cost_code_rate,能通过date和code 与原来数据关联?到这个步骤不能进行了……

还是有更简洁的办法?`

我自己的思路,

#%%

import numpy as np
import pandas as pd
import os

## 控制台打印时显示的2位小数
pd.set_option('precision', 2)
#%%
all_df=pd.read_excel('20200319.xlsx')
all_df.to_csv('abc.csv')
os.getcwd()


## 计算cost总和
## 根据时间段计算COST值总和,形成cost_sum_df表

## 统计出每期cost合计
cost_sum_df=all_df.groupby('date')['cost'].sum().reset_index()
cost_sum_df.rename(columns={'cost':'cost_sum'},inplace=True)
cost_sum_df



## 计算单个name cost当月占比
##* 把all_df与cost_sum_df合并,左连接
##* 计算cost_rate


new_df=pd.merge(all_df,cost_sum_df,on=['date','date'],how='left')
new_df['name_cost_rate']=new_df['cost']/new_df['cost_sum']
# all_df
new_df


## 计算单个code cost当月占比
## * 把all_df与code_cost_sum合并,左连接
## * 计算cost_rate

## 通过pivot_table计算出每期code的合计值
code_cost_sum=all_df.pivot_table(index=['date','code'],values='cost',aggfunc={'cost':(np.sum)})
code_cost_sum.rename(columns={'cost':'cost_code_sum'},inplace=True)
code_cost_sum
回复
阅读 1.1k
1 个回答
✓ 已被采纳

1.统计每个时间段,name类别cost本期的占比。
groupby 中的 apply 函数可以对分组后的数据进行操作

all_df['name_cost_rate'] = all_df.groupby('date')['cost'].apply(lambda x: x / x.sum())

2.统计每个时间段,code类别cost本期的占比。
transform 函数输出的数据长度与输入保持一致

all_df['code_cost_rate'] = all_df.groupby(['date','code'])['cost'].transform(sum) / all_df.groupby('date')['cost'].transform(sum)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏