Как применить groupby к ближайшему элементу - PullRequest
0 голосов
/ 25 января 2019

Как этого добиться?

Что я могу думать о том, что

A['new'] = A[['sth', 'content']].apply(tuple, axis=1)

A.groupby('ID')['new'].apply(list)

но это будет что-то вроде этого

[[(you,A),(me,V),(me,G),(me,K),(you,D)],[(you,L),(me,A),(me,B),(me,c),(me,G)],[(me,G),(you,YT),(you,TY),(me,TY),(you,Q),(me,U)]]

Есть фрейм данных (пусть это будет A):

id      sth content
qwea    you A
qwea    me  V
qwea    me  G
qwea    me  K
qwea    you D
qfzx    you L
qfzx    me  M
qfzx    me  A
qfzx    me  B
qfzx    me  c
gg1234  me  G
gg1234  you YT
gg1234  you TY
gg1234  me  TY
gg1234  you Q
gg1234  me  U

Что я хочу достичь:

[[(you,A),(me,V,G,K),(you,D)],[(you,L),(me,A,B,c,G)],[(me,G),(you,YT,TY),(me,TY),(you,Q),(me,U)]]

1 Ответ

0 голосов
/ 25 января 2019

Используется shift, создайте ключ справки, который является ключевой частью для вашего вопроса, после этого все, что я сделал, это просто переформатировал вывод в то, что вам нужно

df['key']=(df.sth!=df.groupby('id').sth.shift()).ne(0).cumsum()
s=df.groupby(['id','key','sth']).content.apply(list).reset_index(level=2)

l=(s.sth.apply(lambda x :[x])+s.content).apply(tuple).sort_index(level=1).groupby(level=0).apply(list).tolist()

l


[[('me', 'G'), ('you', 'YT', 'TY'), ('me', 'TY'), ('you', 'Q'), ('me', 'U')], [('you', 'L'), ('me', 'M', 'A', 'B', 'c')], [('you', 'A'), ('me', 'V', 'G', 'K'), ('you', 'D')]]
...