【问题标题】:Merge padas rows if the difference between consecutive rows are less than two如果连续行之间的差异小于两个,则合并 padas 行
【发布时间】:2021-05-22 10:09:49
【问题描述】:

我有一个这样的数据框,

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 循环来完成,但它会花费更多时间来执行,寻找一些 pandas 快捷方式来最有效地完成它。

【问题讨论】:

  • 编辑了问题,如果连续 col3 值之间的差异小于 2

标签: python pandas dataframe


【解决方案1】:

如果差异大于等于 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]

【讨论】:

    【解决方案2】:

    使用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, columns=['col1', 'col2', 'col3'])
    
    
    df['diff'] = df['col3'].diff().abs().fillna(0)
    df.loc[df['diff']<2, ['diff']] = 0
    df.loc[df['diff']>=2, ['diff']] = 1
    
    df['diff'] = df['diff'].cumsum()
    
    df_out = df.groupby(['col1', 'diff']).apply(lambda x: [j for i in x['col2'] for j in i]).reset_index()
    df_out.drop(columns=['diff'], inplace=True)
    
    print(df_out)
    
     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]
    

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2017-02-14
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多