Python中基于后续样本修改DataFrame列值的性能优化咨询
高效修改DataFrame列值的解决方案
现有一个按时间排序的DataFrame,结构如下:
| Col1 | Col2 |
|---|---|
| 0.3 | 1 |
| 0.22 | 0 |
| 0.89 | 0 |
| 0.12 | 1 |
| 0.54 | 0 |
| 0.11 | 1 |
其中Col2为二进制列,需求如下:
- 除最后1行外,每行的
Col2值修改为:后续最多2个样本中若存在1则设为1,否则为0(倒数第二行仅需看后续1个样本) - 最后1行保持不变
预期结果:
| Col1 | Col2 |
|---|---|
| 0.3 | 0 |
| 0.22 | 1 |
| 0.89 | 1 |
| 0.12 | 1 |
| 0.54 | 1 |
| 0.11 | 1 |
当前使用循环实现,但大数据集下运行效率极低,原代码如下:
for i, j in df.iterrows(): if i < df.shape[0]-2: df.iloc[i]['Col2'] = max([df.iloc[j]['Col2'] for j in range(i,i+2)])
高效解决方案
利用Pandas的向量化操作替代循环,大幅提升计算效率,核心思路是通过shift获取后续行的值,再用combine计算最大值:
import pandas as pd # 构造示例数据(实际使用时替换为你的DataFrame) data = {'Col1': [0.3, 0.22, 0.89, 0.12, 0.54, 0.11], 'Col2': [1, 0, 0, 1, 0, 1]} df = pd.DataFrame(data) # 获取后续1行和后续2行的Col2值 next_1 = df['Col2'].shift(-1) next_2 = df['Col2'].shift(-2) # 计算后续最多2个样本的最大值:当后续2行不存在时,取后续1行的值 df['Col2'] = next_1.combine(next_2, max, fill_value=next_1) # 恢复最后1行的原始值 df.iloc[-1, df.columns.get_loc('Col2')] = data['Col2'][-1] print(df)
代码说明
shift(-1)/shift(-2):分别获取当前行的后1行、后2行的Col2值,末尾行的移位结果为NaNcombine:对next_1和next_2逐行取最大值,当next_2为NaN(即倒数第二行)时,用next_1填充计算- 恢复最后一行:确保最后一行保持原始值不变
这种向量化操作避免了循环遍历每行,计算效率远高于iterrows循环,尤其适合大数据集场景。
内容的提问来源于stack exchange,提问作者Los
相关产品推荐
相关产品推荐

