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]