Pandas按id分组计算多列标准差与均值并新增为列的实现方法
首先筛选出需要计算的数值列,再批量聚合计算后合并到原表即可,以下是两种可行实现:
方法1:transform 实现(逻辑简单,直接对齐原表行数)
import pandas as pd # 1. 筛选所有数值类型的列,自动排除id、f0这类非数值列 # 如需手动指定列,直接写成 num_cols = ['f1', 'f2', ..., 'fn'] 即可 num_cols = mdata.select_dtypes(include='number').columns.tolist() # 2. 按id分组,对所有数值列同时计算标准差和均值 grouped_stats = mdata.groupby('id')[num_cols].transform( lambda x: pd.Series( [x.std(skipna=True, ddof=1), x.mean(skipna=True)], index=[f'{x.name}_std', f'{x.name}_avg'] ) ) # 3. 将统计列合并到原表 mdata = pd.concat([mdata, grouped_stats], axis=1) # 可选:调整列顺序,让每个原数值列后紧跟对应的std和avg列,和你预期的输出格式一致 ordered_cols = [] for col in mdata.columns: if col not in num_cols: ordered_cols.append(col) else: ordered_cols.extend([col, f'{col}_std', f'{col}_avg']) mdata = mdata[ordered_cols]
方法2:聚合后merge实现(大数据量下性能更高)
import pandas as pd num_cols = mdata.select_dtypes(include='number').columns.tolist() # 1. 先计算每个id对应的所有数值列的统计指标 id_stats = mdata.groupby('id')[num_cols].agg(['std', 'mean']).reset_index() # 把多层列索引展开为单层,按{列名_统计指标}格式命名 id_stats.columns = ['id'] + [f'{col}_{stat}' for col, stat in id_stats.columns[1:]] # 2. 按id关联回原表 mdata = mdata.merge(id_stats, on='id', how='left')
注:你之前写的测试代码中选取了
f0列计算,f0是字符串类型列,无法计算标准差和均值,实际使用时注意选择数值列即可。
内容的提问来源于stack exchange,提问作者jeny ericsoon
相关产品推荐
相关产品推荐

