如何基于VCPI DataFrame按自定义逻辑填充df的C列?
实现DataFrame按规则新增列的解决方案
前提说明
现有两个DataFrame:
df:A列存储CPI类型(CPI_x6/CPI/CPI_x9),B列为日期VCPI:date列为日期,附带对应各类型CPI的数值列
实现步骤
1. 统一日期格式为datetime类型
先把两个DataFrame的日期列转成datetime格式,方便后续时间范围计算:
import pandas as pd # 转换df的日期列 df['B'] = pd.to_datetime(df['B'], format='%d/%m/%Y') # 转换VCPI的日期列并设为索引,加快查找速度 VCPI['date'] = pd.to_datetime(VCPI['date'], format='%d/%m/%Y') VCPI = VCPI.set_index('date')
2. 编写逻辑处理函数
定义一个函数,接收df的每一行数据,根据A列的CPI类型返回对应计算结果:
def get_c_value(row): cpi_type = row['A'] target_date = row['B'] if cpi_type == 'CPI': # 直接取对应日期的CPI数值 return VCPI.loc[target_date, 'CPI'] elif cpi_type == 'CPI_x6': # 计算目标日期往后6个月内的CPI_x6平均值 end_date = target_date + pd.DateOffset(months=6) # 筛选出指定区间内的数据 date_mask = (VCPI.index >= target_date) & (VCPI.index <= end_date) return VCPI.loc[date_mask, 'CPI_x6'].mean() elif cpi_type == 'CPI_x9': # 计算目标日期往后9个月内的CPI_x9平均值 end_date = target_date + pd.DateOffset(months=9) date_mask = (VCPI.index >= target_date) & (VCPI.index <= end_date) return VCPI.loc[date_mask, 'CPI_x9'].mean()
3. 生成新列C
用apply方法将函数应用到df的每一行,生成新增的C列:
df['C'] = df.apply(get_c_value, axis=1)
结果验证
用示例数据测试后,最终df的结果如下:
| A | B | C |
|---|---|---|
| CPI_x6 | 2015-01-01 | 153.333... |
| CPI | 2015-01-01 | 200 |
| CPI_x9 | 2015-03-01 | 566.666... |
| CPI | 2015-05-01 | 150 |
补充提示
- 如果VCPI存在日期缺失的情况,
mean()会自动忽略空值 - 使用
pd.DateOffset处理月份增减,能避免跨月日期溢出的问题
内容的提问来源于stack exchange,提问作者Dmunoz
相关产品推荐
相关产品推荐

