Проблема
У меня есть фрейм данных с некоторыми 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
Идеи
Ближайший пост, который я нашел, о заполнении NaN значениями из одного уровня мультииндекса .
Я также пытался установить индекс df
как мультииндексиспользуя столбцы index1
и index2
, а затем df.fillna
, однако это не работает.