Фильтрация информационного кадра pandas по списку значений столбцов - PullRequest
0 голосов
/ 20 декабря 2018

Это подвыборка моего фрейма данных:

idcontrn    ctosaldo    fecanota    diamovto    fecopera    codsprod
491748      000         2017-08-25         3    2017-08-25         0
1014320     000         2018-05-28     99999    2018-05-28        33
1907630     000         2017-06-12     99999    2017-06-09        21
1573897     000         2018-01-25       613    2018-01-25         0
1713456     000         2017-08-08        17    2017-08-07         0
186315      000         2017-06-29        13    2017-06-28         0
150328      000         2017-10-23         1    2017-10-23        84
1531535     000         2017-04-25         1    2017-04-25        78

Я хотел извлечь топ-20 наиболее часто встречающихся категорий столбца «codsprod» по вхождению, поэтому я сделал это:

pd.DataFrame(sample.groupby(['codsprod']).size()).sort_values(by = 0,ascending = False).reset_index()[0:21]

который дает:

codsprod    0
0   0   319971
1   76  120026
2   33  62017
3   119 48138
4   14  42180
5   104 40756
6   48  26902

и так далее ... до числа 20.

Теперь я хочу отфильтровать исходный df по этим 20 лучшим категориям "codsprod "столбец.Я знаю, как применять фильтры к pandas df на основе условия, но писать что-то вроде:

sample[sample['codsprod'] == category_number] просто утомительно и долго для меня, так как я буду вынужден вручную ставить 20 условий, по одному на каждоекатегория.

Есть ли более быстрый и аккуратный способ добиться этого ??

Заранее большое спасибо.

1 Ответ

0 голосов
/ 20 декабря 2018

Используйте groupby + size + head, чтобы получить самые большие 'codsprod' группы.Используйте .isin, чтобы отфильтровать оригинал DataFrame.Чтобы получить самые большие 2 группы:

df[df.codsprod.isin(df.groupby('codsprod').size().head(2).index)]

Вывод:

   idcontrn  ctosaldo    fecanota  diamovto    fecopera  codsprod
0    491748         0  2017-08-25         3  2017-08-25         0
2   1907630         0  2017-06-12     99999  2017-06-09        21
3   1573897         0  2018-01-25       613  2018-01-25         0
4   1713456         0  2017-08-08        17  2017-08-07         0
5    186315         0  2017-06-29        13  2017-06-28         0

Объяснение:

df.groupby('codsprod').size() возвращает Series, который отсортирован вв порядке убывания в зависимости от размера группы.Значения этого Series являются размерами группы, а индекс этого Series является соответствующим значением 'codsprod':

df.groupby('codsprod').size()
#codsprod
#0     4
#21    1
#33    1
#78    1
#84    1
#dtype: int64

Взятие .head(n) вернет только верхнюю nзаписи, которые в данном случае являются n самыми большими группами.Но обратите внимание, что это не имеет отношения к связям, оно просто берет то, что появляется первым (это не было бы слишком сложно включить все, что также связывает):

df.groupby('codsprod').size().head(2)
#codsprod
#0     4
#21    1
#dtype: int64

На данный момент вам все равноо том, насколько велики группы, вы хотите знать , какие группы самые большие.Так что вам нужны индексы этой серии.

df.groupby('codsprod').size().head(2).index
#Int64Index([0, 21], dtype='int64', name='codsprod')

Это в основном список значений 'codsprod', и для фильтрации DataFrame на основе значения, равного любому значению в этом списке, вы используете .isin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...