You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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")

代码说明

  1. 转长表时将year加入索引,避免转置后year字段被错误重复
  2. 使用agg方法一次性对三个目标列求和,并直接命名为期望的列名
  3. 通过merge将求和结果合并到原表,确保所有行都能匹配到对应日期的求和值
  4. 若不需要保留原始的Medium/Lower/Upper列,可直接使用sum_df作为最终结果

内容的提问来源于stack exchange,提问作者sazaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:24:58