Python Pandas groupby и iloc

У меня есть фрейм данных, содержащий столбец данных, столбец клиента и размер, например:

КлиентДатаРазмер
Пользователь120.10.20214
Пользователь121.10.20215
Пользователь122.10.20216
Пользователь123.10.20216
Каст220.10.20214
Каст221.10.20215
Каст222.10.20216
Каст223.10.20216
Пользователь320.10.20214
Пользователь321.10.20215
Пользователь322.10.20216
Пользователь323.10.20216

Мне нужно извлечь каждую n-ю дату из клиента и удалить остальные. В этом примере - каждый второй:

|Customer|Date|Size|
|--------|----|----|
|Cust1   |20/10/2021|4|
|Cust1   |22/10/2021|6|
|Cust2   |20/10/2021|4|
|Cust2   |22/10/2021|6|
|Cust3   |20/10/2021|4|
|Cust3   |22/10/2021|6|

Извините за неправильный формат, но форматирование таблицы не работает для второй таблицы.

На самом деле это каждый 10-й день, начиная с самого последнего. Пробовал с группой и iloc, но не работает:

df_10 = df.iloc[::10, :]

AttributeError: 'DataFrameGroupBy' object has no attribute 'iloc'

Честно говоря, я вообще не настаиваю на использовании groupby, но пока не могу найти рабочего решения.

Спасибо

Можете ли вы также включить код, который привел к этой ошибке?

osbm 12.05.2022 14:59

Можете ли вы привести реальный пример с фактическими датами (даже с использованием фиктивных данных) и соответствующим выводом?

mozway 12.05.2022 15:07

Я думаю, что сделал оба предложенных изменения.

Yavor I 12.05.2022 15:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ты можешь использовать:

df.loc[df.groupby('Customer').cumcount().mod(2).eq(0)]

выход:

   Customer        Date  Size
0     Cust1  20/10/2021     4
2     Cust1  22/10/2021     6
4     Cust2  20/10/2021     4
6     Cust2  22/10/2021     6
8     Cust3  20/10/2021     4
10    Cust3  22/10/2021     6

объяснение:

df.groupby('Customer').cumcount() создает количество для каждой группы ([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]), затем mod(2) берет по модулю, чтобы дать [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], а eq(0) позволяет выбрать 0 значений.

Если вы хотите взять каждые N строк, начиная с K (первая равна 0): .mod(N).eq(K)

@YavorI, это проблема, не зависящая от вопроса, вы сделали что-то неправильно. У вас должен быть DataFrame. Какие исходные данные? Как вы создаете df?

mozway 12.05.2022 16:46

Итак, вы решили проблему DataFrameGroupBy? ;)

mozway 12.05.2022 16:48

Возможно, это может помочь? Отметьте каждую N-ю строку в группе с помощью панд

С набором данных, похожим на ваш, одним из решений может быть:

df= pd.DataFrame({'Customer': ['Cust1']*20 + ['Cust2']*20,
         'date': range(1,40+1),
         'size':[10]*40})
n=3 # for every 3th row
df.groupby('Customer', group_keys=False).apply(lambda x: x.iloc[n-1::n])

´´´

Другие вопросы по теме