Я пытаюсь разделить Серию на секции, где каждая секция смежна и имеет тот же самый индекс. Итак, для этого ввода:
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)?
Вы могли бы
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
Вы можете превратить свою серию в 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
split
:result = np.split(df.values, np.diff(df.index.values).nonzero()[0]+1)