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

基于多索引与单列创建Pandas差值列(含缺失值处理)

解决方案

需求回顾

需要为DataFrame新增一列value_off-on,规则是:

  • 对每个subject+channel组合,计算condition=off的value减去condition=on的value(即off-on)
  • 若组合缺少任一condition的数据,对应位置填充NaN

正确实现方法

方法1:使用pivot+merge(推荐,高效简洁)

import pandas as pd

d = {
     "subject": [1, 1, 2, 2, 3, 3], 
     "condition": ["on", "off", "on", "off", "on", "off"], 
     "channel": [1, 1, 1, 1, 1, 2],
     "value": [1, 2, 3, 5, 4, 6]
     }
df = pd.DataFrame(data=d)

# 生成各组合的off-on差值表
diff_df = df.pivot(index=['subject', 'channel'], columns='condition', values='value') \
            .eval('off - on') \
            .reset_index(name='value_off-on')

# 合并回原DataFrame
df = df.merge(diff_df, on=['subject', 'channel'], how='left')

执行后结果:

subject condition  channel  value  value_off-on
0        1        on        1      1           1.0
1        1       off        1      2           1.0
2        2        on        1      3           2.0
3        2       off        1      5           2.0
4        3        on        1      4           NaN
5        3       off        2      6           NaN

方法2:使用groupby+unstack+apply

如果需要更灵活的匹配逻辑,也可以用此方法:

# 分组后展开为宽表,计算差值
diff_series = df.groupby(['subject', 'channel', 'condition'])['value'].first() \
                .unstack('condition') \
                .eval('off - on')

# 逐行匹配差值
df['value_off-on'] = df.apply(lambda row: diff_series.get((row['subject'], row['channel']), pd.NA), axis=1)

错误原因说明

你之前的代码报错是因为**DataFrame没有map方法**,map仅适用于Series类型。要实现匹配,要么将匹配键转换为元组(对应多级索引)后使用Series.map,要么直接用merge做关联(更直观高效)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:10:15