带有NAs的series_A
由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
答案 0 :(得分:5)
方法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
方法利用其level
和fill_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
方法3
使用map
从Index
返回的series_A.index.get_level_vaues(0)
对象使用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
方法4
使用np.isnan
和np.flatnonzero
来查找np.nan
s所在的位置。然后找到要使用get_level_values
和map
插入的值。最后,使用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