基于标记DataFrame,用PR对应区间均值填充指定区间行
解决方案:基于标记区间填充均值到新DataFrame
完整实现代码
import pandas as pd import numpy as np # 示例输入数据 flag = pd.DataFrame({'col1': [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan], 'col2': [np.nan,1,-1,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,-1], 'col3': [np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,-1], 'col4': [np.nan,np.nan,np.nan,np.nan,np.nan,1,np.nan,-1,np.nan,np.nan,np.nan] }) PR = pd.DataFrame({'col1': [81,81.3,80.7,81.5,81,80.4,80.3,81,79.5,80.7], 'col2': [80.9,81.6,81.2,81.7,80.9,79.7,79.3,79.1,79,77.5], 'col3': [81.1,81.3,81,81.6,80.8,79.5,79.2,78.8,78.8,77.4], 'col4': [80.1,80.6,79.9,80.4,80.4,79.3,79,78.8,78.4,77] }) # 对齐两个DataFrame的行数(示例中flag多一行,去除冗余行) flag = flag.iloc[:-1].reset_index(drop=True) # 初始化结果DataFrame,与PR同形状,默认填充NaN result = pd.DataFrame(np.nan, index=PR.index, columns=PR.columns) # 逐列处理标记区间 for col in flag.columns: flag_col = flag[col] # 获取所有区间起点(flag=1的索引)和终点(flag=-1的索引) start_points = flag_col[flag_col == 1].index end_points = flag_col[flag_col == -1].index # 按顺序配对起点与终点,处理每个区间 for start, end in zip(start_points, end_points): # 计算PR对应区间的均值,保留两位小数 interval_avg = PR[col].loc[start:end].mean().round(2) # 将均值填充到结果的对应区间 result[col].loc[start:end] = interval_avg # 打印结果 print(result)
步骤说明
- 数据对齐:示例中
flag比PR多一行冗余数据,通过iloc[:-1]去除,确保两个DataFrame结构一致。 - 结果初始化:创建与
PR行列数完全相同的空DataFrame,初始值设为NaN。 - 区间处理:
- 对每一列单独提取标记值,筛选出区间的起点(值为1)和终点(值为-1)的索引。
- 按顺序配对起点和终点,计算
PR对应区间内的均值。 - 将计算得到的均值填充到结果DataFrame的对应区间位置。
输出验证
运行代码后将得到符合预期的输出:
col1 col2 col3 col4 0 NaN NaN NaN NaN 1 NaN 81.40 NaN NaN 2 NaN 81.40 NaN NaN 3 NaN NaN 79.44 NaN 4 NaN 79.25 79.44 NaN 5 NaN 79.25 79.44 79.03 6 NaN 79.25 79.44 79.03 7 NaN 79.25 79.44 79.03 8 NaN 79.25 79.44 NaN 9 NaN 79.25 79.44 NaN
内容的提问来源于stack exchange,提问作者Pedro de Sá
相关产品推荐
相关产品推荐

