Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 熊猫:按类似列值对行进行分组_Python 3.x_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 3.x 熊猫:按类似列值对行进行分组

Python 3.x 熊猫:按类似列值对行进行分组,python-3.x,pandas,dataframe,pandas-groupby,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

有一个看起来像这样的熊猫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 
      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
我想根据以下条件对行进行分组:
abs(当前行+当前行大小-下一行)<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=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条件似乎被忽略了


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

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

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
最后是
.cumsum()
(除了您发布的输出之外,我似乎得到了所有东西:)!:

s=((abs(df['x']+df['size']-df['x'].shift(-1))<10)).cumsum()
df=df.groupby.agg({'x':'first','column':'first',
'word':lambda x:''。联接(列表(x)),'size':'sum','y':'first'})
df
出[2]:
x列字长y
1 1552字1字2字3 434 2
2 2200 3字4字5 271 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,表示x大小的总和:

df["x1"] = df["x"] + df["size"]
现在,我的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 
      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)

结果是预期的:

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

您确定此条件设置正确吗?我的输出不匹配。基于
abs(当前行+当前行大小-下一行)的分组<10
是我希望实现的目标。x是单词的开头,size是单词的大小。因此,如果x+大小足够接近下一个单词(来自下一个df行的x),我想将它们分组。也许
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。
   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