问题
我有一个带有某些NaN的数据框,我试图根据另一个数据框的值来智能地填充。我还没有找到一种有效的方法来做到这一点,但我怀疑大熊猫有办法。
最小示例
index1 = [1, 1, 1, 2, 2, 2]
index2 = ['a', 'b', 'a', 'b', 'a', 'b']
# dataframe to fillna
df = pd.DataFrame(
np.asarray([[np.nan, 90, 90, 100, 100, np.nan], index1, index2]).T,
columns=['data', 'index1', 'index2']
)
# dataframe to lookup fill values from
multi_index = pd.MultiIndex.from_product([sorted(list(set(index1))), sorted(list(set(index2)))])
fill_val_lookup = pd.DataFrame([89, 91, 99, 101], index=multi_index, columns=
['fill_vals'])
开始数据(df
):
data index1 index2
0 nan 1 a
1 90 1 b
2 90 1 a
3 100 2 b
4 100 2 a
5 nan 2 b
查找表以查找要填充NaN的值:
fill_vals
1 a 89
b 91
2 a 99
b 101
所需的输出:
data index1 index2
0 89 1 a
1 90 1 b
2 90 1 a
3 100 2 b
4 100 2 a
5 101 2 b
想法
我找到的最近的帖子是关于filling NaNs with values from one level of a multiindex。
我也尝试过使用列df
和index1
然后使用index2
将df.fillna
的索引设置为多索引,但是这不起作用。 / p>
答案 0 :(得分:1)
combine_first
是您需要的功能。但是首先,更新另一个数据框的索引名称。
fill_val_lookup.index.names = ["index1", "index2"]
fill_val_lookup.columns = ["data"]
df.index1 = df.index1.astype(int)
df.data = df.data.astype(float)
df.set_index(["index1","index2"]).combine_first(fill_val_lookup)\
.reset_index()
# index1 index2 data
#0 1 a 89.0
#1 1 a 90.0
#2 1 b 90.0
#3 2 a 100.0
#4 2 b 100.0
#5 2 b 101.0