У меня есть таблица, которая выглядит следующим образом:панды: группировка по ключу кластер запутанных строк
company_id,company_name
1,Amazon
1,Amazon Ltd
2,Google
1,Amazon
2,Gogle
3,Facebook Ltd
3,Facebook LTD
1,AMAZON
1,AMAZON LTD
2,GOOGLE
3,Facebook
3,Face book
Так у меня есть уникальный идентификатор для каждой компании, но их текстовое представление отличается. То, что я стремиться, чтобы устранить эти несоответствия и что-то вдоль линий:
company_id,company_name
1,Amazon
1,Amazon
2,Google
1,Amazon
2,Google
3,Facebook
3,Facebook
1,Amazon
1,Amazon
2,Google
3,Facebook
3,Facebook
Я не мертв набор на критерий выбора - это может быть наиболее общее значение в пределах указанной группы, это может быть случайный. Но мне нужно что-то эффективное, потому что моя таблица выросла, чтобы содержать миллионы строк.
Моим решением было создать хэш-карту уникальных комбо id -> name
, а затем заменить их на основе этих. Что-то вдоль линий:
dd = df.drop_duplicates().set_index('company_id').to_dict()['company_name']
df.company_name = df.company_id
df.company_name = df.company_name.replace(dd)
Который работает отлично на небольших наборах, но это становится довольно медленными и памятью неэффективно из-за большой хэш-карту он создает.
Я также попытался groupby
на основе company_id
и заменяя все company_name
S внутри каждой группы по случайной величины, но я не мог изменить основную dataframe (без .loc
ИНГ его, что вдвойне неэффективно) ,
Последний способ, который возникает из-за необходимости создать отдельный кадр с уникальными значениями (df.drop_duplicates('company_id')
) и объединить его с исходным фреймом на основе company_id
, но это также не звучит ужасно эффективно.
Ваше решение кажется прекрасным для меня. 'df.company_name = df.company_name.replace (dd)' здесь вместо 'replace', если вы используете' map', это будет намного быстрее. Однако вам нужны эти пары, независимо от того, что я не знаю, как вы решите проблему с памятью. Вы уверены, что это проблема? Сколько уникальных идентификаторов у вас есть? – ayhan
Вам не нужно '.loc' переназначать их обратно в базовый' DF'. 'Groupby.transform' позаботится об этом. –