Предположим, что в группах будет более n участников, я хочу взять каждую n-ю строку из каждой группы. Я посмотрел https://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.core.groupby.GroupBy.nth.html, но для этого требуется только одна строка из каждой группы.
Например:
import pandas as pd
x = pd.DataFrame.from_dict({'a': [1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3], 'b': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]})
a b
0 1 1
1 1 2
2 2 3
3 2 4
4 2 5
5 3 6
6 3 7
7 3 8
8 3 9
9 3 10
10 3 11
11 3 12
И если мы сохраним каждую вторую строку, это будет желаемый результат:
a b
1 1 2
3 2 4
6 3 7
8 3 9
10 3 11






Используйте GroupBy.cumcount по модулю и сравните по 1:
out = x[x.groupby('a').cumcount() % 2 == 1]
print (out)
a b
1 1 2
3 2 4
6 3 7
8 3 9
10 3 11
Как это работает:
print (x.assign(counter=x.groupby('a').cumcount(),
mod2 = x.groupby('a').cumcount() % 2,
mask = x.groupby('a').cumcount() % 2 == 1))
a b counter mod2 mask
0 1 1 0 0 False
1 1 2 1 1 True
2 2 3 0 0 False
3 2 4 1 1 True
4 2 5 2 0 False
5 3 6 0 0 False
6 3 7 1 1 True
7 3 8 2 0 False
8 3 9 3 1 True
9 3 10 4 0 False
10 3 11 5 1 True
11 3 12 6 0 False
Еще одна идея с iloc в GroupBy.apply:
out = x.groupby('a', group_keys=False)[x.columns].apply(lambda x: x.iloc[1::2])
@BaronYugovich - Тогда должно быть решение x.groupby('a', group_keys=False)[x.columns].apply(lambda x: x.iloc[1::2])
Спасибо, а может ли что-то подобное работать?
x.groupby('a').iloc[::2, :]