Я хочу сгруппировать по общему элементу и получить список элементов между ними.

У меня есть набор данных ниже:

pd.DataFrame({'Type': {0: 'S', 1: '1', 2: '3', 3: '3', 4: '2', 5: 'S', 6: '4', 7: 'S', 8: '4', 9: '5', 10: '6', 11: 'S', 12: '2', 13: 'S'}})

   Type
0     S
1     1
2     3
3     3
4     2
5     S
6     4
7     S
8     4
9     5
10    6
11    S
12    2
13    S

Я могу выполнить эту группировку, используя more_itertools, но я хочу знать, есть ли более пандейский способ выполнить эту задачу:

Ожидаемый результат (для этого я использовал more_itertools, но есть ли более пандейский способ?)

import more_itertools
pred = lambda x: x == "S"
list(more_itertools.split_before(df.T.values.tolist()[0], pred)) 

[['S', '1', '3', '3', '2'],
 ['S', '4'],
 ['S', '4', '5', '6'],
 ['S', '2'],
 ['S']]

На заметку, можете ли вы использовать groupby для группировки между элементами, поэтому каждая группа похожа на вывод выше?

4
oppressionslayer 21 Дек 2019 в 04:05

2 ответа

Лучший ответ
df = pd.DataFrame({'Type': {0: 'S', 1: '1', 2: '3', 3: '3', 4: '2', 5: 'S', 6: '4', 7: 'S', 8: '4', 9: '5', 10: '6', 11: 'S', 12: '2', 13: 'S'}})

df['seqnum'] = (df['Type'] == 'S').cumsum()
df.groupby('seqnum')['Type'].apply(list)
2
9mat 21 Дек 2019 в 01:58

Создайте серию, которая указывает, какие строки в каких группах:

groupidx = (df.Type == 'S').cumsum()
grouped = df.groupby(groupidx)
result = grouped.Type.apply(list)

Результат:

1    [S, 1, 3, 3, 2]
2             [S, 4]
3       [S, 4, 5, 6]
4             [S, 2]
5                [S]
1
John Zwinck 21 Дек 2019 в 06:19