Python中如何操作字典内的DataFrame并去除异常值?
解决字典中多DataFrame的3σ异常值去除问题
先梳理你代码里的几个关键错误:
- 初始化字典时
df002 = dict是错的,这是引用Python的dict类,不是创建空字典,应该写成df002 = {} - 循环范围
range(1,41)覆盖不了42个DataFrame,硬编码数字容易出错,直接遍历字典的键更稳妥 - 第一次尝试的代码里重复赋值
Upper_Limit,把Lower_Limit的计算写错了 - 第二次代码里
np.mean(df[x])应该用df1[x],你引用了未定义的df,应该用当前循环的df1 - 每个DataFrame只有两列且仅需基于第二列处理,没必要遍历所有
lst_cont列,直接指定目标列即可,避免重复过滤数据
修正后的完整代码
import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 初始化空字典,用于存储处理后的DataFrame df002 = {} # 遍历原始字典中的每个DataFrame,用items()同时获取键和对应的数据框 for df_key, raw_df in df001.items(): # 获取第二列的列名(如果知道具体列名,直接写比如'value_col'更清晰) target_column = raw_df.columns[1] # 计算3σ上下限 col_mean = np.mean(raw_df[target_column]) col_std = np.std(raw_df[target_column]) upper_bound = col_mean + 3 * col_std lower_bound = col_mean - 3 * col_std # 过滤异常值:保留在上下限之间的数据 filtered_df = raw_df[(raw_df[target_column] < upper_bound) & (raw_df[target_column] > lower_bound)] # 将处理后的DataFrame存入新字典 df002[df_key] = filtered_df # 绘制箱线图并保存,文件名加上字典键避免覆盖 sns.boxplot(x=filtered_df[target_column]) plt.title(f"Filtered Data - {df_key}") plt.savefig(f"boxplot_{df_key}_{target_column}.png") plt.close()
代码说明:
- 用
df001.items()遍历,不管你的字典键是连续数字还是其他类型,都能完整处理42个DataFrame - 直接定位第二列,避免不必要的列循环,提升效率
- 文件名加入字典的键,解决了循环中多次保存覆盖文件的问题
- 修正了所有变量引用错误,确保计算上下限时用的是当前DataFrame的列数据
内容的提问来源于stack exchange,提问作者rukuto
相关产品推荐
相关产品推荐

