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
相关产品推荐
相关产品推荐

