Pandas有没有更优的DataFrame合并方法?用于统计客户各州年均销量
Pandas 最优实现方案
你这个需求属于典型的行转列聚合场景,直接用pandas.pivot_table就能一步完成,不需要多次拆分分组再拼接,代码更简洁性能也更好。
优化后完整代码
import pandas as pd import psycopg2 as pg # 优化点1:SQL层面直接过滤数据、只取需要的字段,减少不必要的数据传输和内存占用 engine = pg.connect("dbname='postgres' user='postgres' host='127.0.0.1' port='8800' password='sh'") # 直接在SQL里筛选2017年数据,只取需要的3个字段,不用拉全表 df = pd.read_sql("select cust, state, quant from sales where year = 2017", con=engine) # 优化点2:用pivot_table一步完成分组聚合+行转列 res = pd.pivot_table( df, index='cust', # 行索引为客户 columns='state', # 列索引为州 values='quant', # 聚合值为销量 aggfunc='mean', # 聚合方式为求平均 fill_value=0 # 可选:如果客户在某州没有销量,填充0 ).reset_index() # 把cust从索引转为普通列 # 优化点3:批量重命名列,符合你要求的输出格式 res.columns = ['CUST'] + [f'AVG_{col}' for col in res.columns[1:]] print(res)
原实现方案的问题说明
你原来多次拆分数据、分别分组再join的实现方式有几个明显缺陷:
- 代码冗余,要是州的数量多,需要写大量重复逻辑
- 左join逻辑会丢失只在CT、NJ有消费记录的客户数据
- 列名需要手动逐个修改,容易出错
用pivot_table的实现完美规避了以上问题,且性能远高于多次拆分拼接的写法。
内容的提问来源于stack exchange,提问作者Swayam Shah
相关产品推荐
相关产品推荐

