如何统计Pandas中按ID分组的Type组合出现次数及对应均价
实现代码
你可以分两步聚合实现需求,先按ID生成每个ID对应的类型组合和单ID均价,再按组合维度统计最终结果:
import pandas as pd # 构造示例数据,你实际用的时候替换成自己的DataFrame即可 df = pd.DataFrame({ 'ID': [1,2,1,3,4,2,1], 'Type': ['A','B','B','A','A','B','A'], 'Price': [230,150,180,280,222,124,221] }) # 第一步:按ID分组生成单ID的类型组合、单ID均价 id_level = df.groupby('ID').agg( # 统计类型频次后排序拼接,确保相同组合的字符串完全一致 Combination=('Type', lambda s: '[' + ', '.join([f"{cnt}x {typ}" for typ, cnt in sorted(s.value_counts().items())]) + ']'), id_avg=('Price', 'mean') ).reset_index() # 第二步:按组合分组统计出现次数、组合对应均价 final_res = id_level.groupby('Combination', as_index=False).agg( Counts=('ID', 'count'), Mean_Price=('id_avg', 'mean') ).rename(columns={'Mean_Price': 'Mean Price'}).round(2) # 如果需要把小数点换成逗号,加上这行即可 final_res['Mean Price'] = final_res['Mean Price'].astype(str).str.replace('.', ',')
输出的final_res就和你给出的预期结果完全一致。
关键说明
- 对类型频次的结果加
sorted是为了避免同一组合因为Type出现顺序不同,生成的字符串不一样导致统计错误,比如同一个ID的Type序列是[A,B,A]和[B,A,A],最终生成的组合字符串都会是[2x A, 1x B] - 单ID先算均价再按组合取平均,是符合你给出的示例计算逻辑的,如果需求是按组合下所有原始Price算平均,把第二步的聚合逻辑改成
('Price', 'mean')即可。
内容的提问来源于stack exchange,提问作者Numbermind
相关产品推荐
相关产品推荐

