You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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)

输出结果

AGEPOP扰动说明
5100原行_0
5.5100行0_列AGE扰动
5110行0_列POP扰动
10200原行_1
11200行1_列AGE扰动
10220行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:50:30