具有如下所示的熊猫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条件似乎也被忽略了。
有什么可能的方法吗?谢谢
答案 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)
失败了。也许有更多经验的人可以解释。