如何按多列日期的唯一值分组计算DataFrame的价格均值?
解决方案
步骤1:构造示例DataFrame(可跳过,直接用你的数据)
如果需要复现示例数据,先运行这段代码:
import pandas as pd data = { 'Price': [10, 18, 67, 23, 38, 41], 'Date.1': ['10/22/22', '8/1/22', '8/1/22', '10/11/22', '10/22/22', '6/7/22'], 'Date.2': ['11/23/22', '10/22/22', '11/23/22', '10/22/22', '11/23/22', None], 'Date.3': ['12/31/22', None, None, None, '12/31/22', None] } df = pd.DataFrame(data, index=range(1,7))
步骤2:转换数据格式并计算均值
核心是把多列日期转换成日期-价格的一对一关联格式,再分组计算:
# 筛选所有日期列(列名含Date的列) date_columns = [col for col in df.columns if 'Date' in col] # 把原索引转为行号列,方便后续查看对应行 df = df.reset_index().rename(columns={'index': 'Row'}) # 融化数据:将多列日期合并为单列,保留行号和价格 melted_data = df.melt( id_vars=['Row', 'Price'], value_vars=date_columns, value_name='Date' ).dropna(subset=['Date']) # 移除日期为空的行 # 按日期分组,计算价格均值并收集对应行号 final_result = melted_data.groupby('Date').agg( 价格均值=('Price', 'mean'), 对应行号=('Row', lambda x: ', '.join(map(str, x))) ).reset_index() print(final_result)
输出结果
运行后会得到如下格式的结果:
| Date | 价格均值 | 对应行号 |
|---|---|---|
| 10/11/22 | 23.0 | 4 |
| 10/22/22 | 22.25 | 1, 2, 4, 5 |
| 11/23/22 | 38.333333 | 1, 3, 5 |
| 12/31/22 | 24.0 | 1, 5 |
| 6/7/22 | 41.0 | 6 |
| 8/1/22 | 42.5 | 2, 3 |
说明
- 用
melt函数替代split是更高效的多列数据转换方式,能快速把宽表转为长表,让每个日期都和对应价格关联。 - 如果不需要行号,只保留均值,可以简化聚合逻辑:
melted_data.groupby('Date')['Price'].mean().reset_index()
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

