Python 3.x 熊猫:按类似列值对行进行分组
有一个看起来像这样的熊猫df: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
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