熊猫:按相似的列值对行进行分组

时间:2020-10-14 09:48:13

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

具有如下所示的熊猫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条件似乎也被忽略了。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

经过几个小时的努力后,我才开始工作。

根据此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 ,代表 x size 的总和:

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)) > 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)) < 10)失败了。也许有更多经验的人可以解释。