Python 如果连续行之间的差异小于两行,则合并padas行

Python 如果连续行之间的差异小于两行,则合并padas行,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个这样的数据框 df col1 col2 col3 A [p,s] 2 A [q] 3 A [r,t] 4 A [p,x] 7 B [x,y] 8 C [s] 4 C [t,v] 6 C [u,x] 7 df按col1

我有一个这样的数据框

df
col1     col2         col3
 A       [p,s]         2
 A       [q]           3
 A       [r,t]         4
 A       [p,x]         7
 B       [x,y]         8
 C       [s]           4
 C       [t,v]         6
 C       [u,x]         7 
df按col1排序。现在,对于上一行或/和下一行的每个col1值,如果连续col3值之间的差值小于2,则将col2值合并到一行中。所以数据框看起来像

df
col1    col2
 A      [p,s,q,r,t]
 A      [p,x]
 B      [x,y]
 C      [s]
 C      [t,v,u,x]

这可以通过每次过滤col1值来使用for循环完成,但需要更多的时间来执行,并寻找一些快捷方式来最有效地完成。如果差值大于等于2,则可以创建组,并首先使用累积和:

df['g'] = df.groupby('col1')['col3'].apply(lambda x: x.diff().ge(2).cumsum())
然后在lambda函数中使用列进行聚合,并展平列表:

f = lambda x: [z for y in x for z in y]
df = df.groupby(['col1','g'])['col2'].agg(f).reset_index(level=1, drop=True).reset_index()
print (df)
  col1             col2
0    A  [p, s, q, r, t]
1    A           [p, x]
2    B           [x, y]
3    C              [s]
4    C     [t, v, u, x]

使用
diff
计算差异,之后的
cumsum
取组并获得列表

d=['A',['p','s',2],
[A',[q'],3],
[A',[r',[t'],4],
[A',[p',[x'],7],
[B',[x',[y'],8],
[C',[s'],4],
[C',[t',[v'],6],
[C',[u',[x'],7]]
df=pd.DataFrame(d,列=['col1','col2','col3'])
df['diff']=df['col3'].diff().abs().fillna(0)
df.loc[df['diff']=2,['diff']=1
df['diff']=df['diff'].cumsum()
df_out=df.groupby(['col1','diff'])。应用(lambda x:[j代表i in x['col2']代表j in i])。重置索引()
df_out.drop(列=['diff'],inplace=True)
打印(df_输出)

编辑问题,如果连续col3值之间的差值小于2
 col1                0
0    A  [p, s, q, r, t]
1    A           [p, x]
2    B           [x, y]
3    C              [s]
4    C     [t, v, u, x]