Pandas fillna在multiindex系列

Jam*_*ong 2 python pandas

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)

piR*_*red 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
Run Code Online (Sandbox Code Playgroud)

方法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
Run Code Online (Sandbox Code Playgroud)

方法3
使用从callable 返回mapIndex对象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.isnannp.flatnonzero找到np.nans 所在位置.然后找到要插入的值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
Run Code Online (Sandbox Code Playgroud)