循环中为DataFrame子集赋值时出现NaN异常求助
这个问题我遇到过!核心原因是pandas用DataFrame赋值时的列名对齐机制在搞鬼,咱们一步步拆解解决:
问题根源
你用iloc切片多列得到的是DataFrame对象,当把一个DataFrame赋值给另一个DataFrame时,pandas会优先按列名进行对齐,而不是你预期的位置匹配。你的源列(sm_col:sm_col+2)和目标列(orig_start_col:orig_start_col+2)列名完全不同,所以赋值后找不到匹配的列,自然全是NaN。
而你单独赋值第一列时,用的是iloc[:, col_idx]得到的是Series对象,Series只有行索引没有多列名的限制,赋值时只按行索引对齐,所以能正常生效。
解决方案1:直接用底层数值数组赋值(最直接)
绕过列名对齐,直接把源切片的数值数组赋值给目标位置:
for node_col in ('leg2_node', 'leg4_node'): combo = orig_combos.merge(all, how='inner', left_on='leg6_node', right_on=node_col) combo.reset_index(drop=True, inplace=True) orig_start_col = combo.columns.get_loc('leg6_alpha_x') sm_col = combo.columns.get_loc(node_col + '_y') # 关键:加.values获取二维数值数组,按位置赋值 combo.iloc[:, orig_start_col:orig_start_col+2] = combo.iloc[:, sm_col:sm_col+2].values
解决方案2:用列名赋值(更直观,避免位置计算错误)
先拿到目标列和源列的名称,直接通过列名赋值(同样可以加.values跳过列名对齐):
for node_col in ('leg2_node', 'leg4_node'): combo = orig_combos.merge(all, how='inner', left_on='leg6_node', right_on=node_col) combo.reset_index(drop=True, inplace=True) orig_start_col = combo.columns.get_loc('leg6_alpha_x') sm_col = combo.columns.get_loc(node_col + '_y') # 获取列名 target_cols = combo.columns[orig_start_col:orig_start_col+2] source_cols = combo.columns[sm_col:sm_col+2] # 赋值 combo[target_cols] = combo[source_cols].values
解决方案3:逐列赋值(沿用你单列成功的逻辑)
既然单列赋值没问题,那就循环两列分别赋值:
for node_col in ('leg2_node', 'leg4_node'): combo = orig_combos.merge(all, how='inner', left_on='leg6_node', right_on=node_col) combo.reset_index(drop=True, inplace=True) orig_start_col = combo.columns.get_loc('leg6_alpha_x') sm_col = combo.columns.get_loc(node_col + '_y') # 逐列赋值 for i in range(2): combo.iloc[:, orig_start_col + i] = combo.iloc[:, sm_col + i]
你可以试试打印combo.iloc[:,sm_col:sm_col+2].columns和combo.iloc[:,orig_start_col:orig_start_col+2].columns,就能看到两边列名完全不一样,这就是问题的根源。
内容的提问来源于stack exchange,提问作者Eduardo EPF
相关产品推荐
相关产品推荐

