У меня есть фрейм данных, содержащий столбец данных, столбец клиента и размер, например:
| Клиент | Дата | Размер |
|---|---|---|
| Пользователь1 | 20.10.2021 | 4 |
| Пользователь1 | 21.10.2021 | 5 |
| Пользователь1 | 22.10.2021 | 6 |
| Пользователь1 | 23.10.2021 | 6 |
| Каст2 | 20.10.2021 | 4 |
| Каст2 | 21.10.2021 | 5 |
| Каст2 | 22.10.2021 | 6 |
| Каст2 | 23.10.2021 | 6 |
| Пользователь3 | 20.10.2021 | 4 |
| Пользователь3 | 21.10.2021 | 5 |
| Пользователь3 | 22.10.2021 | 6 |
| Пользователь3 | 23.10.2021 | 6 |
Мне нужно извлечь каждую 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, но пока не могу найти рабочего решения.
Спасибо
Можете ли вы привести реальный пример с фактическими датами (даже с использованием фиктивных данных) и соответствующим выводом?
Я думаю, что сделал оба предложенных изменения.






Ты можешь использовать:
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?
Итак, вы решили проблему DataFrameGroupBy? ;)
Возможно, это может помочь? Отметьте каждую 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])
´´´
Можете ли вы также включить код, который привел к этой ошибке?