Панды, замените NaN значениями из MultiIndex DataFrame - PullRequest
0 голосов
/ 07 февраля 2019

Проблема

У меня есть фрейм данных с некоторыми 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, однако это не работает.

1 Ответ

0 голосов
/ 07 февраля 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...