一行代碼:
df.reset_index().groupby('A')['index'].apply(np.array)
代碼,例如:
In [1]: import numpy as np
In [2]: from pandas import *
In [3]: df = DataFrame([3]*4+[4]*4+[1]*4, columns=['A'])
In [4]: df
Out[4]:
A
0 3
1 3
2 3
3 3
4 4
5 4
6 4
7 4
8 1
9 1
10 1
11 1
In [5]: df.reset_index().groupby('A')['index'].apply(np.array)
Out[5]:
A
1 [8, 9, 10, 11]
3 [0, 1, 2, 3]
4 [4, 5, 6, 7]
您也可以直接從GROUPBY對象訪問信息:
In [1]: grp = df.groupby('A')
In [2]: grp.indices
Out[2]:
{1L: array([ 8, 9, 10, 11], dtype=int64),
3L: array([0, 1, 2, 3], dtype=int64),
4L: array([4, 5, 6, 7], dtype=int64)}
In [3]: grp.indices[3]
Out[3]: array([0, 1, 2, 3], dtype=int64)
爲了解決這一DSM提到你可以做類似的情況:
In [1]: df['block'] = (df.A.shift(1) != df.A).astype(int).cumsum()
In [2]: df
Out[2]:
A block
0 3 1
1 3 1
2 3 1
3 3 1
4 4 2
5 4 2
6 4 2
7 4 2
8 1 3
9 1 3
10 1 3
11 1 3
12 3 4
13 3 4
14 3 4
15 3 4
現在GROUPBY列和應用lambda函數:
In [77]: df.reset_index().groupby(['A','block'])['index'].apply(np.array)
Out[77]:
A block
1 3 [8, 9, 10, 11]
3 1 [0, 1, 2, 3]
4 [12, 13, 14, 15]
4 2 [4, 5, 6, 7]
這假定值不在不連續的段中重複,例如DataFrame([3] * 4 + [4] * 4 + [1] * 4 + [3] * 4,columns = ['A '])'會將兩個3個羣組放入同一個羣組。你可以掃描那些休息時間,但這只是原始問題的另一個版本。不過,也許有一種方法可以讓熊貓'groupby'在這裏表現得更像'itertools.groupby'。 – DSM
謝謝,你的第二個解決方案運作良好。實際上我有DSM描述的情況。 – languitar
怎麼可能這樣做,如果你被一些偏差要組(如組包含所有值都在原來的集中+ -1相鄰值的值) – ryanjdillon