You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,根据你的需求调整
)

运行后得到的透视表结构如下:

code201710201711
103.53.0
201.52.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:49:12