Мой фрейм данных:
import pandas as pd
df = pd.DataFrame(
{
'a': list('xxxxxxxxxxyyyyyyyyy'),
'b': list('1111222333112233444')
}
)
Ожидаемый результат — это список групп:
a b
0 x 1
1 x 1
2 x 1
3 x 1
4 x 2
5 x 2
6 x 2
a b
4 x 2
5 x 2
6 x 2
7 x 3
8 x 3
9 x 3
a b
10 y 1
11 y 1
12 y 2
13 y 2
a b
12 y 2
13 y 2
14 y 3
15 y 3
a b
14 y 3
15 y 3
16 y 4
17 y 4
18 y 4
Логика:
Группировка начинается с df.groupby(['a', 'b'])
, а затем я хочу соединить каждую группу с предыдущей, что дает мне ожидаемый результат.
Возможно, первоначальная группировка, о которой я упомянул, не нужна.
Обратите внимание, что в ожидаемом результате столбец a
не может содержать одновременно x
и y
.
Честно говоря, перекрывающиеся строки — это не то, что я делал при использовании groupby
. Так что я не знаю, как попытаться это сделать. Я пробовал df.b.diff()
, но это даже не близко.
Вы можете объединить groupby , itertools.pairwise и concat:
from itertools import pairwise
out = [pd.concat([a[1], b[1]]) for a, b in pairwise(df.groupby(['a', 'b']))]
Функциональный вариант:
from itertools import pairwise
from operator import itemgetter
out = list(map(pd.concat, pairwise(map(itemgetter(1), df.groupby(['a', 'b'])))))
Обратите внимание: вам может понадобиться использовать sort=False
в groupby, если вы хотите сохранить первоначальный порядок.
Выход:
[ a b
0 x 1
1 x 1
2 x 1
3 x 1
4 x 2
5 x 2
6 x 2,
a b
4 x 2
5 x 2
6 x 2
7 x 3
8 x 3
9 x 3,
a b
7 x 3
8 x 3
9 x 3
10 y 1
11 y 1,
a b
10 y 1
11 y 1
12 y 2
13 y 2,
a b
12 y 2
13 y 2
14 y 3
15 y 3,
a b
14 y 3
15 y 3
16 y 4
17 y 4
18 y 4]