Pandas: Заполнение нанов низкой производительностью - избегайте итерации по строкам? - PullRequest
0 голосов
/ 19 мая 2018

У меня проблема с производительностью при заполнении пропущенных значений в моем наборе данных.Это касается набора данных строк 500 МБ / 5.000.0000 (Kaggle: Expedia 2013).

Было бы проще использовать df.fillna(), но, похоже, я не могу использовать это, чтобы заполнить каждый NaN другим значением.

Я создал таблицу lookup:

srch_destination_id | Value
    2        0.0110
    3        0.0000
    5        0.0207
    7           NaN
    8           NaN
    9           NaN
    10       0.1500
    12       0.0114

Эта таблица содержит в srch_destination_id соответствующее значение для замены NaN на dataset.

# Iterate over dataset row per row. If missing value (NaN), fill in the min. val
# found in lookuptable.
for row in range(len(dataset)):
    if pd.isnull(dataset.iloc[row]['prop_location_score2']):
        cell = dataset.iloc[row]['srch_destination_id']
        df.set_value(row, 'prop_location_score2', lookuptable.loc[cell])

Этот код работает при итерации более 1000 строк, но при итерации по всем 5 миллионам строк мой компьютер никогда не завершает работу (я ждал несколько часов).

Есть ли лучший способ сделать то, что я делаю?Я где-то ошибся?

1 Ответ

0 голосов
/ 19 мая 2018

pd.Series.fillna принимает серию или словарь, а также скалярные значения замены.

Следовательно, вы можете создать отображение серии из lookup:

s = lookup.set_index('srch_destination')['Value']

Тогдаиспользуйте это для заполнения NaN значений в dataset:

dataset['prop_loc'] = dataset['prop_loc'].fillna(dataset['srch_destination'].map(s.get))

Обратите внимание, что на входе fillna мы отображаем идентификатор из dataset.Кроме того, мы используем pd.Series.map для выполнения необходимого отображения.

...