多指数系列中的Pandas fillna

时间:2017-06-04 14:07:18

标签: python pandas

带有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

1 个答案:

答案 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方法利用其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

方法3
使用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

方法4
使用np.isnannp.flatnonzero来查找np.nan s所在的位置。然后找到要使用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