的series_A为NAS由多指标索引(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
Run Code Online (Sandbox Code Playgroud)
并series_B包含要填写的值:
bar 0.123
foo 0.456
Run Code Online (Sandbox Code Playgroud)
方法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
Run Code Online (Sandbox Code Playgroud)
方法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
Run Code Online (Sandbox Code Playgroud)
方法3
使用从callable 返回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
Run Code Online (Sandbox Code Playgroud)
方法4
使用np.isnan并np.flatnonzero找到np.nans 所在位置.然后找到要插入的值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
Run Code Online (Sandbox Code Playgroud)