如何为Pandas DataFrame生成单元素扰动行以开展敏感度分析
Pandas单元素扰动敏感度分析实现
针对遍历DataFrame每行、仅对单个元素乘以1.1做扰动,同时保留原行生成分析表格的需求,以下是具体实现方法:
示例输入
import pandas as pd df = pd.DataFrame({'AGE':[5,10],'POP':[100,200]})
基础循环实现(适合小数据集)
通过逐行遍历生成原行和扰动行,逻辑直观易懂:
import pandas as pd df = pd.DataFrame({'AGE':[5,10],'POP':[100,200]}) result = [] # 遍历每一行,生成原行和单元素扰动行 for row_idx, original_row in df.iterrows(): # 添加原行,附带标识说明 result.append(original_row.to_dict() | {'扰动说明': f'原行_{row_idx}'}) # 对当前行的每个列单独生成扰动行 for col_name in df.columns: perturbed_row = original_row.copy() perturbed_row[col_name] *= 1.1 result.append(perturbed_row.to_dict() | {'扰动说明': f'行{row_idx}_列{col_name}扰动'}) # 转换为结果DataFrame result_df = pd.DataFrame(result).reset_index(drop=True) print(result_df)
输出结果
| AGE | POP | 扰动说明 |
|---|---|---|
| 5 | 100 | 原行_0 |
| 5.5 | 100 | 行0_列AGE扰动 |
| 5 | 110 | 行0_列POP扰动 |
| 10 | 200 | 原行_1 |
| 11 | 200 | 行1_列AGE扰动 |
| 10 | 220 | 行1_列POP扰动 |
向量化优化实现(适合大数据集)
如果数据量较大,循环遍历效率偏低,可以用向量化方法提升性能:
import pandas as pd import numpy as np df = pd.DataFrame({'AGE':[5,10],'POP':[100,200]}) col_count = len(df.columns) # 扩展原DataFrame,每个原行重复(1+列数)次(原行+每个列的扰动行) repeat_times = [col_count + 1] * len(df) expanded_df = df.loc[df.index.repeat(repeat_times)].reset_index(drop=True) # 生成扰动说明列 desc_list = [] for idx in df.index: desc_list.append(f'原行_{idx}') desc_list.extend([f'行{idx}_列{col}扰动' for col in df.columns]) expanded_df['扰动说明'] = desc_list # 创建掩码,标记需要扰动的元素位置 mask = np.zeros_like(expanded_df.drop('扰动说明', axis=1), dtype=bool) start_pos = 0 for i in range(len(df)): # 跳过原行(第1个位置),依次标记每个列的扰动位置 for j, col in enumerate(df.columns): mask[start_pos + 1 + j, df.columns.get_loc(col)] = True start_pos += col_count + 1 # 对掩码标记的元素应用扰动 expanded_df.loc[mask, df.columns] *= 1.1 print(expanded_df)
内容的提问来源于stack exchange,提问作者Lu_Ca
相关产品推荐
相关产品推荐

