基于多索引与单列创建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
相关产品推荐
相关产品推荐

