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

Pandas分组累计相减报错:无法将多列DataFrame赋值给单列

问题描述

我有一个包含Adjusted Feed Vessel Weight列的DataFrame,数据如下:

sample_time Acid Totalizer  Adjusted Feed Vessel Weight hermes_run
0.51    0   3476.2  H11958-5
52.59   0   3437    H11958-5
72.73   0   3336.2  H11958-5
96.14   0   3224.9  H11958-5
120.23  0   3123.4  H11958-5
142.21  0   3039.4  H11958-5
166.12  0   2947    H11958-5
191.3   0   2855.3  H11958-5
216.48  0   2783.9  H11958-5
239.97  0   2734.2  H11958-5

运行以下代码时触发错误:ValueError: Cannot set a DataFrame with multiple columns to the single column feed_difference

feed_weight = RCS_df.groupby('hermes_run').apply(lambda x: x['Adjusted Feed Vessel Weight'].sub(x['Adjusted Feed Vessel Weight'].shift(-1))) # g
#RCS_df['Weight_draw'] = Weight_draw.reset_index(level = 0, drop=True) # kg
feed_difference = feed_weight.shift(1)
feed_difference = feed_difference.fillna(0)
RCS_df['feed_difference'] = feed_difference.reset_index(level = 0, drop=True) # g

打印feed_weight后发现它不是单列结构,而是如下形式:

Adjusted Feed Vessel Weight     0      1      2      3     4     5     6  
hermes_run                                                                 
H11958-5                     39.2  100.8  111.3  101.5  84.0  92.4  91.7 

请问如何让feed_weight以单列形式呈现,解决上述报错?

解决方案

问题根源是groupby().apply()将计算结果转换为了多列DataFrame,导致后续赋值时结构不匹配。可以用两种方式解决:

方式一:改用transform替代apply

transform会自动保持与原DataFrame一致的索引结构,直接返回单列Series,无需额外处理:

feed_weight = RCS_df.groupby('hermes_run')['Adjusted Feed Vessel Weight'].transform(
    lambda x: x.sub(x.shift(-1))
)

方式二:调整apply后的结果结构

如果坚持使用apply,可以通过stack()将多列数据转为单列,再重置索引对齐原数据:

feed_weight = RCS_df.groupby('hermes_run').apply(
    lambda x: x['Adjusted Feed Vessel Weight'].sub(x['Adjusted Feed Vessel Weight'].shift(-1))
).stack().reset_index(level=1, drop=True)

调整后feed_weight会变成与原DataFrame行数匹配的单列Series,后续赋值代码即可正常执行,不会再触发结构不匹配的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:55:43