Разделить серии панд на непрерывные куски по значению индекса

1

Я пытаюсь разделить Серию на секции, где каждая секция смежна и имеет тот же самый индекс. Итак, для этого ввода:

df = pd.Series([1,2,3,4,5,6,7], index=[1,1,1,2,2,1,1])

Желательным результатом будет три куска, такие как:

[[1,2,3], [4,5], [6,7]]

Я пытался использовать groupby но это группирует [1,2,3] и [6,7] в один раздел, который нежелателен, так как они не смежны:

>>> groups = list(df.groupby(df.index, sort=False))
>>> len(groups)
2

Можно ли это сделать в Pandas (или Numpy)?

  • 1
    Вы можете использовать функцию numpy split : result = np.split(df.values, np.diff(df.index.values).nonzero()[0]+1)
Теги:
pandas
numpy
pandas-groupby

2 ответа

2
Лучший ответ

Вы могли бы

In [761]: [v.tolist() for _, v in df.groupby(df.index.to_series().diff().ne(0).cumsum())]
Out[761]: [[1, 2, 3], [4, 5], [6, 7]]

подробности

Получите последовательные куски.

In [762]: df.index.to_series().diff().ne(0).cumsum()
Out[762]:
1    1
1    1
1    1
2    2
2    2
1    3
1    3
dtype: int32
1

Вы можете превратить свою серию в dataframe, а затем использовать groupby с shift + cumsum:

df = df.reset_index()

group_key = (df['index'] != df['index'].shift()).cumsum()
res = df.groupby(group_key)[0].apply(list).values.tolist()

print(res)

[[1, 2, 3], [4, 5], [6, 7]]

group_key перечисляет группы значений:

print(group_key)

0    1
1    1
2    1
3    2
4    2
5    3
6    3
Name: index, dtype: int32

Ещё вопросы

Сообщество Overcoder
Наверх
Меню