使用pd.wide_to_long后指定前缀列求和异常,仅返回首个结果
问题:pd.wide_to_long求和异常,仅能输出第一个求和结果
问题描述
使用pd.wide_to_long时,以Medium开头的列(如5+7)求和无法得到正确结果12,同时以Lower、Upper开头的列求和也存在异常,仅能输出第一个求和结果sum-Md。
原始DataFrame
Date Medium-Ab Lower-B.c Upper-Dd Medium-Fb Lower-Gc Upper-H.I year 09/2022 5 3 10 7 4 12 2022 10/2022 8 4 12 9 6 14 2022 11/2022 9 6 14 10 9 16 2022 12/2022 15 14 20 5 4 18 2022 01/2023 17 13 25 13 8 12 2023 ... ... ... ... ... ... ... ... 12/2023 16 11 24 16 12 19 2023 01/2024 27 23 35 33 28 42 2023 ... ... ... ... ... ... ... ... 12/2024 10 11 14 16 12 19 2023 ... ... ... ... ... ... ... ... 12/2032 ... ... ... ... ... ... ...
期望结果
Date Medium-Ab Lower-B.c Upper-Dd Medium-Fb Lower-Gc Upper-H.I year sum-Md sum-Lo sum-Up 09/2022 5 3 10 7 4 12 2022 12 7 22 10/2022 8 4 12 9 6 14 2022 ... ... ... 11/2022 9 6 14 10 9 16 2022 ... ... ... ... ... ... ... ... ... ... ... ... ... ... 11/2022 ... ... ... ... ... ... ... ... ... ...
尝试的代码
df['sum-Md','sum-Lo','sum-Up'] = ( pd.wide_to_long( df, stubnames=["Medium", 'Lower', 'Upper'], i=["Date",], j="zone", sep="-", suffix='\w+' ) .query("year>=2022", engine="python") .groupby("Date") .Medium .sum() .array )
问题分析与解决方案
你的代码仅对Medium列做了求和,却试图将单一结果赋值给三个新列,这是异常的核心原因。同时pd.wide_to_long的使用方式需要调整,确保能同时聚合所有目标列。
修正后的代码
# 转长表并分组求和 sum_df = ( pd.wide_to_long( df, stubnames=["Medium", "Lower", "Upper"], i=["Date", "year"], # 保留year作为索引,避免转置后重复处理 j="zone", sep="-", suffix=r"\w+" ) .reset_index() .query("year >= 2022") .groupby("Date") .agg( sum-Md=("Medium", "sum"), sum-Lo=("Lower", "sum"), sum-Up=("Upper", "sum") ) .reset_index() ) # 将求和结果合并回原始DataFrame df = df.merge(sum_df, on="Date", how="left")
代码说明
- 转长表时将
year加入索引,避免转置后year字段被错误重复 - 使用
agg方法一次性对三个目标列求和,并直接命名为期望的列名 - 通过
merge将求和结果合并到原表,确保所有行都能匹配到对应日期的求和值 - 若不需要保留原始的Medium/Lower/Upper列,可直接使用
sum_df作为最终结果
内容的提问来源于stack exchange,提问作者sazaki
相关产品推荐
相关产品推荐

