Pandas对多级索引系列进行fillna

5
series_A中存在NA值,它的索引是由MultiIndex (X, Y)构成的,而需要填充的值在Series_B中,它的索引是由X构成的。如何有效地解决这种问题?
例如,下面是series_A的样子:
bar  one    0.299368
     two         NaN
baz  one   -0.863838
     two   -0.251905
foo  one    1.063327
     two         NaN
qux  one    0.206053
     two    0.408204

series_B 包含要填入的值:

bar  0.123
foo  0.456

1
问题需要改进。 - tim
刚刚更新了帖子。 - James Wong
1个回答

11

方法1
使用unstack将第一层索引放入列中,然后使用fillna

series_A.unstack(0).fillna(series_B).unstack().dropna()

bar  one    0.299368
     two    0.123000
baz  one   -0.863838
     two   -0.251905
foo  one    1.063327
     two    0.456000
qux  one    0.206053
quz  two    0.408204
dtype: float64

方法 2
使用add方法结合其levelfill_value参数,然后再使用combine_first

series_A.combine_first(series_A.add(series_B, level=0, fill_value=0))

bar  one    0.299368
     two    0.123000
baz  one   -0.863838
     two   -0.251905
foo  one    1.063327
     two    0.456000
qux  one    0.206053
quz  two    0.408204
dtype: float64

第三种方法
使用series_A.index.get_level_values(0)返回的Index对象上的map函数,其中可调用的函数是series_B.get

series_A.fillna(
    pd.Series(series_A.index.get_level_values(0).map(series_B.get), series_A.index)
)

bar  one    0.299368
     two    0.123000
baz  one   -0.863838
     two   -0.251905
foo  one    1.063327
     two    0.456000
qux  one    0.206053
quz  two    0.408204
dtype: float64

第四种方法
使用np.isnannp.flatnonzero查找np.nan的位置。然后使用get_level_valuesmap查找要插入的值。最后,使用iloc将其放入相应位置。

i = np.flatnonzero(np.isnan(series_A.values))
series_A.iloc[i] = series_A.index.get_level_values(0)[i].map(series_B.get)
series_A

bar  one    0.299368
     two    0.123000
baz  one   -0.863838
     two   -0.251905
foo  one    1.063327
     two    0.456000
qux  one    0.206053
quz  two    0.408204
dtype: float64

1
非常感谢!您真的很专业,帮助我克服了许多挫折:D - James Wong
@JamesWong 很高兴我能帮到你! - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接