2016-11-01 2 views
1

Я работаю с набором данных, который имеет 3 миллиона строк и 1200 «групп» - назовем их «Последние имена».Python - группировка (или цикл) на основе значения столбца (или подмножества)

Вот то, что набор данных выглядит следующим образом:

LastName FirstName 

Smith  Rachael 
Smith  John 
Smith  Rachael 
Johnson  Bob 
Johnson  Laura 
Johnson  Laura 

Я хочу смотреть на каждую фамилию отдельно, и сделать что-то из первых имен в каждой фамилии. Например, я могу захотеть узнать, какое первое имя является наиболее распространенным в фамилии Смита, а затем добавить это как свой собственный столбец (но на самом деле это намного сложнее, чем это). Мне нужно держать все строки неповрежденными (другими словами, мне нужно держать каждого Смита и каждого Джонсона).

LastName FirstName HighestFreq 

Smith  Rachael  Rachael 
Smith  John  Rachael 
Smith  Rachael  Rachael 
Johnson  Bob   Laura 
Johnson  Laura  Laura 
Johnson  Laura  Laura 

Я не знаю, если это лучший способ разделить набор данных на 1200 наборов данных, а затем объединить вместе в конце или сделать какой-то цикл. Я очень новичок в Python и не смог понять, как это сделать правильно. Я вычислил код, который мне нужен, чтобы посмотреть на отдельные строки, а теперь как смотреть только на одну фамилию за раз.

Кроме того, если подмножество является наилучшим способом, мне нужно будет указать наборы в цикле, поскольку я, очевидно, не буду называть 1 200 наборов данных вручную.

Спасибо за чтение.

+0

Я не думаю, что вам нужно создать 1200 наборов данных, но почему бы и нет. Сортировка исходного набора данных по интересующей категории всегда является хорошим началом (что может быть не тривиально, если ваш набор данных будет большим для хранения в памяти). После сортировки вы, скорее всего, удерживаете все свои значения для одной категории в переменных. –

ответ

1

Чтобы сохранить длину возвращаемого результата, вы можете использовать transform после groupby, а затем использовать value_counts() функцию с index, чтобы получить наиболее частый элемент в каждой группе:

df['HighestFreq'] = (df.groupby('LastName')['FirstName'] 
         .transform(lambda g: g.value_counts().index[0])) 
df 

enter image description here

+0

Следует упомянуть, что это решение основано на NumPy и NumPy, возможно, недоступно, так как оно требует некоторых системных зависимостей. Тем не менее, кажется хорошей идеей использовать что-то, что решает проблемы управления памятью для вас. Я думал о sqlite, но думал, что лучшим решением будет «чистый» Python. –

+2

Я мало знаю о нижнем капоте библиотеки Pandas, это решение использует панды. Я считаю, что если панды зависят от Numpy, вы должны установить его по пути при установке панд? – Psidom

+0

Извините, я не видел тег Pandas на вопрос. –

0

Вот только в случае без Pandas (см. ниже с Pandas):

Сортировка файла по категориям, которую вы хотите сгруппировать, с помощью команды Unix или Python сценарий, см. здесь sorting large text data.

Затем перебирайте отсортированный файл и получите показатели, которые вы хотите для каждой категории. Поскольку все экземпляры категории теперь находятся рядом друг с другом, вам нужно только сохранить результат в памяти.

Если вы хотите пропустить сортировку, вы также можете несколько раз перебирать файл (но это может быть медленным). Разумеется, ваша идея сохранить промежуточные результаты на диске.

Расширенное чтение: Это в основном операция уменьшения карты: создание подгрупп обрабатывает их отдельно, а затем объединяет результаты.