【问题标题】:Pandas: Group rows by similar column valuePandas:按相似的列值对行进行分组
【发布时间】:2020-10-14 09:48:13
【问题描述】:

有一个看起来像这样的 pandas df:

      x  column     word  size  y   
0  1552       0    word1   218  2           
1  1775       1    word2    53  2        
2  1999       2    word3   163  2               
3  2200       3    word4   142  2                
4  2345       4    word5   129  2 

我想根据条件对行进行分组: abs(current_row_x + current_row_size - next_row_x) < 10

因此,此处所需的 df 将是:

      x  column     word         size  y   
0  1552       0     word1 word2   271  2                   
1  1999       2     word3         163  2               
3  2200       3     word4 word5   271  2                

我现在尝试的如下:

df = df.groupby((abs(df.x + df.size - df.x.shift(1)) < 10).cumsum()).agg({'y':'min', 'x':'min', 'size':'sum', 'column':'min', 'word':' '.join}) 
                                                                                                   
                                                                                                        

但结果 df 并不完全符合我的预期,而且 groupby 条件似乎也被忽略了。

有什么可能的方法吗?谢谢

【问题讨论】:

  • 您确定此条件设置正确吗?我的输出不匹配。
  • 基于abs(current_row_x + current_row_size - next_row_x) &lt; 10 的组是我想要完成的。 x 是单词开始的位置,size 是单词大小。因此,如果 x + size 足够接近下一个单词(下一个 df 行中的 x ),我想对它们进行分组。也许df = df.groupby((abs(df.x + df.size - df.x.shift(1)) &lt; 10).cumsum()).agg({'y':'min', 'x':'min', 'size':'sum', 'column':'min', 'word':' '.join}) 方法是完全错误的。我尝试了不同的方法,但没有运气。目标是获得所需的 df。

标签: python-3.x pandas dataframe pandas-groupby


【解决方案1】:

我没有得到相同的输出,但请尝试:

s = abs(df['x'] + df['size'] - df['x'].shift(-1)) < 10
df = df.groupby(s).agg({'x' : 'first', 'column' : 'first',
                        'word' : lambda x: ' '.join(list(x)), 'size' : 'sum', 'y' : 'first'})
df

Out[1]: 
          x  column               word  size  y
False  1775       1  word2 word3 word5   345  2
True   1552       0        word1 word4   360  2

或者,.groupby.cumcount

s = df.groupby((abs(df['x'] + df['size'] - df['x'].shift(-1)) < 10)).cumcount()
df = df.groupby(s).agg({'x' : 'first', 'column' : 'first',
                        'word' : lambda x: ' '.join(list(x)), 'size' : 'sum', 'y' : 'first'})
df
Out[2]: 
      x  column         word  size  y
0  1552       0  word1 word2   271  2
1  1999       2  word3 word4   305  2
2  2345       4        word5   129  2

终于有了.cumsum()(我似乎得到了所有东西,除了你发布的输出:)!):

s = ((abs(df['x'] + df['size'] - df['x'].shift(-1)) < 10)).cumsum()
df = df.groupby(s).agg({'x' : 'first', 'column' : 'first',
                        'word' : lambda x: ' '.join(list(x)), 'size' : 'sum', 'y' : 'first'})
df
Out[2]: 
      x  column               word  size  y
1  1552       0  word1 word2 word3   434  2
2  2200       3        word4 word5   271  2

【讨论】:

    【解决方案2】:

    经过几个小时的努力,我成功了。

    从这个df开始:

          x  column     word  size  y   
    0  1552       0    word1   218  2           
    1  1775       1    word2    53  2        
    2  1999       2    word3   163  2               
    3  2200       3    word4   142  2                
    4  2345       4    word5   129  2 
    

    我做的第一件事是添加另一列 x1 代表 xsize 的总和:

    df["x1"] = df["x"] + df["size"]
    

    所以现在,我的 df 看起来像这样:

          x  column   word  size  y    x1
    0  1552       0  word1   218  2  1770
    1  1775       1  word2    53  2  1828
    2  1999       2  word3   163  2  2162
    3  2200       3  word4   142  2  2342
    4  2345       4  word5   129  2  2474
    

    现在,我用(df.x - df.x1.shift(1)) &gt; 10)这个条件进行分组:

    df = df.groupby(((df.x - df.x1.shift(1)) > 10).cumsum()).agg({'y':'min', 'x':'min', 'size':'sum', 'column':'min', 'word':' '.join})
    

    结果是预期的:

       y     x  size  column         word
    0  2  1552   271       0  word1 word2
    1  2  1999   163       2        word3
    2  2  2200   271       3  word4 word5
    

    得到它的工作,但我真的不知道为什么组合条件(abs(df.x + df.size - df.x.shift(1)) &lt; 10) 失败了。也许有经验的人可以解释一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多