Группировка нескольких столбцов и присвоение значений каждому, учитывая начало и конец каждого (Pandas) - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть датафрейм, который выглядит так

df1
    v   w   x   y                               
4   0   1   a   b
5   0   1   a   a
_________________
6   0   2   a   b
_________________
2   0   3   a   b 
- - - - - - - - -   
3   1   2   a   b
_________________
15  1   3   a   b
12  1   3   b   b
_________________
13  1   1   a   b
- - - - - - - - - 
15  3   1   a   b
14  3   1   b   a
8   3   1   a   b
9   3   1   a   a

, поэтому df1 были сгруппированы (строки) по v и w и объединены с другим df, содержащим x и y. Мне нужен новый столбец z, который выбирает правую группу из x и y со следующими условиями:

  1. в каждой подгруппе 'V' (пунктирная линия) первая группа должна иметь значение 'x' ( x всегда начинается с 'a' внутри группы, y всегда начинается с 'b')
  2. в зависимости от конечной буквы каждой группы (a или b), следующая группа должна начинаться с b (column'y ') или (столбец 'x')
  3. , если обе группы заканчиваются одной и той же буквой, выберите следующую группу из 'x'

Должно выглядеть следующим образом:

df1
    v   w   x   y   z                            
4   0   1   a   b   a
5   0   1   a   a   a
_____________________
6   0   2   a   b   b
_____________________
2   0   3   a   b   a
- - - - - - - - - -- -   
3   1   2   a   b   a
_____________________
15  1   3   a   b   b
12  1   3   b   b   b
_____________________
13  1   1   a   b   a
 - - - - - - - - - - 
15  3   1   a   b   a
14  3   1   b   a   b
8   3   1   a   b   a
9   3   1   a   a   a

поэтому последняя буква группы и первая буква следующей группы в подгруппах 'v' должны быть разными. Это понятно и кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 30 апреля 2020

IIU C

df=df.reset_index(drop=True)
s=pd.DataFrame(np.sort(df[['x','y']],axis=1),index=df.index)[1].iloc[::-1].ne('b').cumsum()
df.groupby([df.v,df.w,s]).ngroup()
0     0
1     0
2     1
3     2
4     4
5     5
6     5
7     3
8     6
9     6
10    6
11    6
dtype: int64
...