Назовите смежные группы Истинных элементов в Серии Панд - PullRequest
0 голосов
/ 22 октября 2018

У меня есть серия булевых значений для панд, и я хотел бы пометить смежные группы значений True.Как это возможно сделать?Возможно ли сделать это в векторизации?Любая помощь будет принята с благодарностью!

Данные:

     A  
0  False  
1  True  
2  True  
3  True  
4  False  
5  False  
6  True  
7  False  
8  False  
9  True  
10 True

Желательно:

     A    Label
0  False   0    
1  True    1   
2  True    1  
3  True    1  
4  False   0
5  False   0  
6  True    2
7  False   0
8  False   0
9  True    3
10 True    3

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

С cumsum

a = df.A.values
z = np.zeros(a.shape, int)

z[a] = pd.factorize((~a).cumsum()[a])[0] + 1

df.assign(Label=z)

        A  Label
0   False      0
1    True      1
2    True      1
3    True      1
4   False      0
5   False      0
6    True      2
7   False      0
8   False      0
9    True      3
10   True      3
0 голосов
/ 22 октября 2018

Вы можете использовать cumsum и groupby + ngroup для маркировки групп.

v = (~df.A).cumsum().where(df.A).bfill()   
df['Label'] = (
    v.groupby(v).ngroup().add(1).where(df.A).fillna(0, downcast='infer'))

df
       A  Label
0   False      0
1    True      1
2    True      1
3    True      1
4   False      0
5   False      0
6    True      2
7   False      0
8   False      0
9    True      3
10   True      3
0 голосов
/ 22 октября 2018

Вот маловероятное, но простое и работающее решение:

import scipy.ndimage.measurements as mnts

labeled, clusters = mnts.label(df.A.values)
# labeled is what you want, cluster is the number of clusters.

df.Labels = labeled # puts it into df

Протестировано как:

a = array([False, False,  True,  True,  True, False,  True, False, False,
        True, False,  True,  True,  True,  True,  True,  True,  True,
        False, True], dtype=bool)

labeled, clusters = mnts.label(a)

>>> labeled
array([0, 0, 1, 1, 1, 0, 2, 0, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 0, 5], dtype=int32)

>>> clusters
5
...