Я в настоящее время в растерянности, так как у меня огромный Pandas DataFrame (более 1 миллиона строк), и я смотрю на 3 столбца, а именно:
Company_Name Business_ID Location
ABC, Inc. BY2389AS MTV
ABC, Inc. 100020 LMD
XYZW 010012 MTV
XYZW 010012 LMD
XYZW AB23JKF QAT
BA23F3
SomethingCo 2342
SomethingCo ALD
Как видно иногда некоторые поля отсутствуют. Я хочу проверить это с данным реестром (он содержит миллионы триплетов в формате CSV (Company_Name, Business_ID, Location), и, если есть уникальное совпадение, попробуйте вернуть пропущенные поля (если существует уникальное совпадение) .
Реестр будет выглядеть примерно так в формате CSV:
Company_Name, Business_ID, Location
ABC, Inc., BY2389AS, MTV
ABC, Inc., 100020, LMD
XYZW, 010012, MTV
XYZW, 010012, LMD
XYZW, AB23JKF, QAT
DLCComp, BA23F3, PLT
DLCComp, 234XYZ, QAT
SomethingCo, 2342, COD
SomethingCo, 2020 , ALD
Как видно выше, в этом файле CSV ничего не пропущено.
Предупреждение выполнение группы данных DataFrame, сводной таблицы, стека / unstack или даже логического поиска и выбор подмножества кадра данных замедляет это (поскольку просмотр всего реестра занимает много времени. У меня есть набор логик c для go и, если некоторые поля отсутствуют, просматривают реестр для обработки уникальных совпадений и заполняют пропущенные поля, в противном случае просто возвращают как есть, если уникальное совпадение не может быть идентифицировано.
Похоже, что поиск по словарю идеально - но так как любая комбинация из 3 полей может отсутствовать, я не могу создать словарь из этого гигантского реестра aframe (который я читаю в память для текущих целей) и создаю ключ по одному из столбцов.
Я пытаюсь придумать, какой тип данных будет идеальным для обработки, и подумал о циклических или иерархических словарях ( если таковые существуют), но это также становится немного сложнее, так как поиск должен был бы приспособиться к различным парам ключ-значение в зависимости от того, какое значение отсутствует в базе данных по сравнению с реестром. Стоимость реорганизации или поднабора фрейма данных на основе доступных значений столбца занимает некоторое время - и я пытаюсь выяснить, существует ли хорошая структура данных или алгоритм, который может решить эту проблему. Я также пытаюсь понять, может ли Pandas иметь очень эффективный способ подстановки кадра данных с помощью логических операций (что я сейчас и делаю) следующим образом:
# Example for if Business_ID is populated, but both Company_Name and Location are not:
def specific_case_func_for_demo_purposes(company_name, business_id, location):
if not company_name and business_id and not location:
subset_df = registry_df[registry_df[Business_ID] == business_id_im_looking_for]
if len(subset_df) == 0:
return company_name, business_id, location
elif len(subset_df) == 1:
return subset_df['Company_Name'], business_id, subset_df['Location']
else:
# handle case when there are multiple business_id matches by seeing if company name is unique, since company name can be identified by business ID:
if len(subset_df['Company_Name'].unique()) == 1:
return subset_df['Company_Name'].iloc[0], business_id, location
else:
# can't possible know if there is a unique match - so just return the empty company_name and location
return company_name, business_id, location
Это просто функция для обрабатывать этот конкретный конкретный c случай, когда Business_ID заполнен, а Company_Name и Location - нет. Это может стать запутанным, как можно видеть. В настоящее время я занимаюсь всеми 8 случаями (некоторые из которых можно сократить до дубликатов или, по сути, одного и того же случая, то есть в целом около 4 случаев с парой подсистем), но это кажется крайне неэффективным как в плане дизайна, так и в плане производительности. При использовании подмножества данных CSV реестра с числом строк = 800 000 и выполнении этого типа логики c на ~ 400 точках данных, это заняло 35 с при stdev 128 мс с использованием% timeit. Я использовал df.apply, используя основную функцию, которую я разработал, чтобы рассчитать это время.
Я хотел бы знать структуру данных, которая может обеспечить хороший поиск и время установки при применении этого к гораздо большим фреймам данных - я знаю должен быть гораздо более эффективный способ, будь то эффективное использование Pandas методов или различных структур данных, таких как словари взаимного поиска (или циклические или иерархические словари, если такие понятия существуют), потенциально основанные на деревьях методы или другие вещи. Я приветствую любые комментарии по этому вопросу.