如何按指定索引层级将Series作为新列添加至DataFrame?
多层索引DataFrame按层级匹配添加Series列出现NaN的原因及解决方法
现有Series
n_position 0 0.000000e+00 1 9.960938e-07 2 2.001953e-06 3 2.998047e-06 4 4.003906e-06 ... 329 3.289941e-04 330 3.300000e-04 331 3.309961e-04 332 3.320020e-04 333 3.329980e-04 Name: Distance (m), Length: 334, dtype: float64
现有多层索引DataFrame
x (m) y (m) z (m) ... n_position n_trigger n_channel n_pulse ... 0 0 1 1 -0.002926 0.001314 0.071339 ... 2 -0.002926 0.001314 0.071339 ... 4 1 -0.002926 0.001314 0.071339 ... 2 -0.002926 0.001314 0.071339 ... 1 1 1 -0.002926 0.001314 0.071339 ... ... ... ... ... ... 333 109 4 2 -0.002926 0.001647 0.071339 ... 110 1 1 -0.002926 0.001647 0.071339 ... 2 -0.002926 0.001647 0.071339 ... 4 1 -0.002926 0.001647 0.071339 ... 2 -0.002926 0.001647 0.071339 ... [148296 rows x 36 columns]
用户问题
尝试执行代码 df[series.name] = series 后,新列所有值均为NaN,需明确原因及正确实现方式(按n_position索引层级将Series作为新列添加到DataFrame)
原因分析
直接赋值时,Pandas会尝试用DataFrame的完整多层索引去匹配Series的单层索引,两者结构不匹配,导致无法对齐,最终填充NaN。
DataFrame的索引是4层(n_position/n_trigger/n_channel/n_pulse),而Series只有1层索引(n_position),缺少其他层级的匹配信息,所以无法直接对应。
解决方法
方法1:提取层级索引后用map匹配
df['Distance (m)'] = df.index.get_level_values('n_position').map(series)
提取DataFrame索引中n_position层的值,通过map关联到Series的对应取值,实现逐行匹配。
方法2:用join方法连接(推荐)
先将Series转为单层索引的DataFrame,再按n_position层级与原DataFrame左连接:
# 将Series转为带层级索引的DataFrame series_df = series.reset_index().set_index('n_position') # 按n_position层级自动匹配所有对应行 df = df.join(series_df)
利用Pandas的层级索引连接机制,自动将Series的值映射到对应n_position的所有行。
方法3:用assign方法生成新列
df = df.assign(**{'Distance (m)': df.index.get_level_values('n_position').map(series)})
逻辑与方法1一致,通过assign返回新的DataFrame(不修改原对象)。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

