Pandas中无需重置索引,基于n_trigger索引合并DataFrame列
问题描述
我有两个DataFrame:
data_df是包含n_trigger和signal_name的多级索引结构,数据示例如下:
Amplitude (V) Noise (V) Rise time (s) ... n_trigger signal_name ... 0 reference_trigger 0.123044 0.001194 3.394432e-10 ... DUT 0.260159 0.003952 6.088619e-10 ... 1 reference_trigger 0.245865 0.001394 2.640444e-10 ... DUT 0.230720 0.002880 5.774005e-10 ... 2 reference_trigger 0.089424 0.001273 2.786659e-10 ... ... ... ... ... ... 6663 DUT 0.332948 0.004620 6.000350e-10 ... 6664 reference_trigger 0.240404 0.001109 2.693422e-10 ... DUT 0.229863 0.002180 6.013701e-10 ... 6665 reference_trigger 0.086362 0.001335 3.179252e-10 ... DUT 0.195570 0.003701 6.279319e-10 ...
filter_df是以n_trigger为单索引的结构,包含accepted列,数据示例如下:
accepted n_trigger 0 True 1 True 2 True 3 True 4 True ... ... 6661 True 6662 True 6663 True 6664 True 6665 True
需要将filter_df的accepted列合并到data_df中,基于n_trigger索引匹配。直接执行data_df['accepted'] = filter_df['accepted']无效,目前只能通过多次重置/设置索引实现,操作繁琐,求无需重置索引的合并方法。
解决方案
以下几种方法都可以无需重置索引,直接完成合并:
方法1:利用索引级别提取 + map匹配
通过提取data_df多级索引中的n_trigger级别,再用map关联filter_df的accepted值:
data_df['accepted'] = data_df.index.get_level_values('n_trigger').map(filter_df['accepted'])
原理:get_level_values('n_trigger')会提取出每行对应的n_trigger值,map方法会根据这些值从filter_df中匹配对应的accepted结果,自动填充到data_df的每一行。
方法2:使用join方法指定索引级别
join方法支持指定索引级别进行对齐合并,直接将filter_df的列合并到data_df:
data_df = data_df.join(filter_df, level='n_trigger')
原理:join默认按索引对齐,指定level='n_trigger'后,会忽略data_df的第二个索引级别,仅以n_trigger为键完成合并,每个n_trigger对应的两行数据都会带上对应的accepted值。
方法3:assign链式操作(可选)
如果需要保持链式调用风格,可以用assign结合索引提取:
data_df = data_df.assign(accepted=data_df.index.get_level_values('n_trigger').map(filter_df['accepted']))
效果和方法1一致,只是写法更简洁,适合在数据处理流水线中使用。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

