Pandas如何忽略取值顺序对两列执行分组聚合操作
实现方法
核心思路是为每一行生成不区分Colour1、Colour2顺序的统一分组键,再基于分组键计算均值回写即可,以下是可直接运行的实现方案:
高性能版本(推荐,适合数据量较大的场景)
依赖numpy实现按行快速排序生成统一分组键:
import pandas as pd import numpy as np # 构造示例数据 mydf = pd.DataFrame({'Colour1': ['Red', 'Red', 'Blue', 'Green', 'Blue'], 'Colour2': ['Red', 'Blue', 'Red', 'Blue', 'Green'], 'Rating': [4, 5, 7, 8, 2]}) # 对两列颜色按行升序排序,生成忽略顺序的分组元组 group_key = [tuple(x) for x in np.sort(mydf[['Colour1', 'Colour2']], axis=1)] # 分组计算均值后直接映射回原表 mydf['MeanRating'] = mydf['Rating'].groupby(group_key).transform('mean')
无额外依赖版本(写法更易懂,适合小数据量场景)
仅用pandas的apply方法生成分组键:
import pandas as pd mydf = pd.DataFrame({'Colour1': ['Red', 'Red', 'Blue', 'Green', 'Blue'], 'Colour2': ['Red', 'Blue', 'Red', 'Blue', 'Green'], 'Rating': [4, 5, 7, 8, 2]}) # 对每行的两个颜色值排序后转元组作为分组键 group_key = mydf.apply(lambda row: tuple(sorted([row['Colour1'], row['Colour2']])), axis=1) mydf['MeanRating'] = mydf['Rating'].groupby(group_key).transform('mean')
两种方案运行后得到的结果和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

