使用Pandas pivot_table获取行列平均值及分组计算时间差均值
没问题,我帮你一步步实现这个需求,下面是详细的代码和解释:
步骤1:构造并初始化示例DataFrame
首先我们把你提供的数据转换成可运行的pandas DataFrame,同时确保各列的类型符合要求:
import pandas as pd # 构造原始数据 data = { 'code': ['10', '10', '10', '10', '20', '20', '20', '20'], 'y_m': ['201710', '201710', '201711', '201711', '201710', '201710', '201711', '201711'], 'date_1': ['2017-10-01', '2017-10-07', '2017-11-06', '2017-11-02', '2017-10-03', '2017-10-07', '2017-11-06', '2017-11-02'], 'date_2': ['2017-10-06', '2017-10-09', '2017-11-08', '2017-11-06', '2017-10-04', '2017-10-08', '2017-11-09', '2017-11-03'] } df = pd.DataFrame(data) # 转换日期列为datetime类型(对应你提到的ISODate) df['date_1'] = pd.to_datetime(df['date_1']) df['date_2'] = pd.to_datetime(df['date_2']) # 确保code和y_m为字符串类型 df['code'] = df['code'].astype(str) df['y_m'] = df['y_m'].astype(str)
步骤2:计算天数差并添加分组平均列
avg_days 先计算每行的date_2 - date_1的天数差,再按code和y_m分组计算平均天数,最后把这个平均值合并回原DataFrame:
# 计算每行的天数差(提取Timedelta的天数部分) df['days_diff'] = (df['date_2'] - df['date_1']).dt.days # 按code和y_m分组,计算每组的平均天数 group_avg = df.groupby(['code', 'y_m'])['days_diff'].mean().reset_index(name='avg_days') # 将分组平均结果合并回原DataFrame,每个分组的所有行都会带上对应的avg_days df = df.merge(group_avg, on=['code', 'y_m'], how='left')
处理后,原DataFrame会新增days_diff(单条记录的天数差)和avg_days(对应分组的平均天数)两列,比如code=10、y_m=201710的两条记录,avg_days会是(5+2)/2=3.5。
步骤3:用pivot_table生成行列平均值透视表
如果需要以code为行、y_m为列,直观展示每个分组的平均天数,可以用pandas的pivot_table:
# 生成行列平均值的透视表 pivot_avg = pd.pivot_table( df, values='days_diff', index='code', columns='y_m', aggfunc='mean', fill_value=0 # 可选:如果有空值可以填充为0,根据你的需求调整 )
运行后得到的透视表结构如下:
| code | 201710 | 201711 |
|---|---|---|
| 10 | 3.5 | 3.0 |
| 20 | 1.5 | 2.0 |
完整可运行代码
把上面的步骤整合起来,就是完整的代码:
import pandas as pd # 构造原始数据 data = { 'code': ['10', '10', '10', '10', '20', '20', '20', '20'], 'y_m': ['201710', '201710', '201711', '201711', '201710', '201710', '201711', '201711'], 'date_1': ['2017-10-01', '2017-10-07', '2017-11-06', '2017-11-02', '2017-10-03', '2017-10-07', '2017-11-06', '2017-11-02'], 'date_2': ['2017-10-06', '2017-10-09', '2017-11-08', '2017-11-06', '2017-10-04', '2017-10-08', '2017-11-09', '2017-11-03'] } df = pd.DataFrame(data) # 转换日期列和类型 df['date_1'] = pd.to_datetime(df['date_1']) df['date_2'] = pd.to_datetime(df['date_2']) df['code'] = df['code'].astype(str) df['y_m'] = df['y_m'].astype(str) # 计算天数差和分组平均 df['days_diff'] = (df['date_2'] - df['date_1']).dt.days group_avg = df.groupby(['code', 'y_m'])['days_diff'].mean().reset_index(name='avg_days') df = df.merge(group_avg, on=['code', 'y_m'], how='left') # 生成透视表 pivot_avg = pd.pivot_table(df, values='days_diff', index='code', columns='y_m', aggfunc='mean', fill_value=0) # 输出结果 print("处理后的DataFrame:") print(df) print("\n行列平均值透视表:") print(pivot_avg)
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

