Pandas groupby按条件筛选样本实现分组数值标准化的方法问询
实现方法
你可以先按box分组预计算每个分组下仅fruit为apple样本的均值和标准差,再将统计量映射回原表做标准化计算,这种方法可读性高、运行效率也更好:
import pandas as pd # 原始数据 d = {'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 'value': [10, 8, 7, 7, 0, 2, 9, 4, 0, 9, 10, 4, 5, 5], 'box': [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2], 'fruit': ['apple', 'apple', 'apple', 'lime', 'lime', 'orange', 'orange', 'lime', 'orange', 'apple', 'apple', 'apple', 'orange', 'orange'] } dummy_df = pd.DataFrame(d) # 1. 预计算每个box下apple样本的均值、标准差 apple_stats = dummy_df[dummy_df['fruit'] == 'apple'].groupby('box')['value'].agg(apple_mean='mean', apple_std='std') # 2. 将统计量合并到原表 dummy_df = dummy_df.join(apple_stats, on='box') # 3. 计算标准化值 dummy_df['value_apple_stand'] = (dummy_df['value'] - dummy_df['apple_mean']) / dummy_df['apple_std'] # 可选:删除中间生成的统计量列 dummy_df = dummy_df.drop(columns=['apple_mean', 'apple_std'])
如果想要更简洁的单行写法,也可以直接对分组后的子DataFrame做筛选计算:
dummy_df['value_apple_stand'] = dummy_df.groupby('box', group_keys=False).apply( lambda g: (g['value'] - g[g['fruit']=='apple']['value'].mean()) / g[g['fruit']=='apple']['value'].std() )
两种方法完全符合你的计算规则:box1用apple样本均值8.33、标准差1.52计算,box2用apple样本均值7.66、标准差3.21计算。
内容的提问来源于stack exchange,提问作者b0zg0r
相关产品推荐
相关产品推荐

