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

发布于 2022-09-12 01:43:25 字数 1577 浏览 29 评论 0

,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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

幸福%小乖 2022-09-19 01:43:25

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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文