Я хочу сгруппировать по общему элементу и получить список элементов между ними.
У меня есть набор данных:
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 для группировки между элементами, поэтому каждая группа похожа на вывод выше?
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)
Создайте серию, которая указывает, какие строки в каких группах:
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]
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.