Панды - Отображение текста с несколькими индексами в столбце - PullRequest
1 голос
/ 18 октября 2019

У меня есть два больших набора данных, которые я не могу объединить, объединив два кадра данных. Сначала я должен выполнить агрегирование на df_train, а затем сопоставить значения с df_test.

df_train и df_test с такими же точными id1 и id2, но df_test есть больше образцов. Я вычисляю целевое среднее на id1 и id2 и сохраняю его как словарь для проблем с памятью.

target_mean = df_train.groupby(['id1', 'id2'])['target'].mean().to_dict()

Это вывод агрегации. Ключи - это пары кортежей с id1 в качестве первого элемента и id2 в качестве второго элемента, а значения являются целевыми средствами групп.

{(0, 0): 146.45497131347656,
 (1, 0): 74.86539459228516,
 (2, 0): 14.551384925842285,
 (3, 0): 235.5499725341797,
 (4, 0): 976.5567626953125,
 (5, 0): 17.894445419311523,
 (6, 0): 64.06660461425781,
 (7, 0): 350.33416748046875,
 (7, 1): 3097.043701171875,
 (8, 0): 256.92779541015625,
 (9, 0): 72.7147445678711 }

Как сопоставить эти значения с id1 и id2 столбцы правильно?

(Есть 60 миллионов строк данных, 1449 id1 и 4 id2значения, поэтому скорость важна)

РЕДАКТИРОВАТЬ :

df_train[['id1', 'id2']].map(target_mean)

Я пробовал это, но map поддерживается только pd.Series.

1 Ответ

1 голос
/ 18 октября 2019

Я думаю, лучше использовать DataFrame.join здесь:

target_mean = df_train.groupby(['id1', 'id2'])['target'].mean().rename('avg')

df_test = df_test.join(target_mean, on=['id1', 'id2'])

Ваше решение возможно, но я думаю, что медленнее с map на MultiIndex:

target_mean = df_train.groupby(['id1', 'id2'])['target'].mean().to_dict()
df_test['avg'] = df_test.set_index(['id1', 'id2']).index.map(target_mean)
...