如何基于自定义函数索引Pandas DataFrame以提取异常值?
解决提取原DataFrame异常值对应行的问题
情况1:分组后的HOSIERY_df保留了原DataFrame的索引
如果你的HOSIERY_df是通过groupby('SKUGROUP').get_group('HOSIERY')得到的(未重置索引),它的索引和原DataFrame完全对应,直接用找到的异常值索引去原表取行即可:
# 假设原DataFrame名为main_df,find_outliers_IQR返回的异常值索引是outlier_indices outlier_full_rows = main_df.loc[outlier_indices]
情况2:分组后的HOSIERY_df重置了索引
如果分组时用了reset_index()导致索引被重置,需要先从HOSIERY_df里提取原DataFrame的索引,再去原表取数:
- 分组时保留原索引列(不要设置
drop=True):
HOSIERY_df = main_df.groupby('SKUGROUP').get_group('HOSIERY').reset_index(drop=False)
- 从异常值索引对应的行中提取原表索引:
original_outlier_indices = HOSIERY_df.loc[outlier_indices, 'index']
- 用原索引获取原DataFrame的完整行:
outlier_full_rows = main_df.loc[original_outlier_indices]
更稳妥的替代方案:直接在原表筛选分组后找异常
绕过分组后索引混乱的问题,先在原DataFrame里筛选出SKUGROUP为HOSIERY的子集,再找异常值,子集的索引和原表完全对应:
# 先筛选HOSIERY分组的行 hosiery_subset = main_df[main_df['SKUGROUP'] == 'HOSIERY'] # 找VOLUME列的异常值位置索引(子集的位置索引,非原表索引) outlier_positions = find_outliers_IQR(hosiery_subset['VOLUME']) # 通过子集iloc拿到原表索引,再提取原表完整行 outlier_full_rows = main_df.loc[hosiery_subset.iloc[outlier_positions].index]
内容的提问来源于stack exchange,提问作者Cyprus_Knolls
相关产品推荐
相关产品推荐

