首页 > 解决方案 > Python Pandas groupby 并加入

问题描述

我对 python pandas 相当陌生,在任何旧帖子中都找不到我的问题的答案。

我有一个看起来像这样的简单数据框:

dfA ={'stop':[1,2,3,4,5,1610,1611,1612,1613,1614,2915,...]
      'seq':[B, B, D, A, C, C, A, B, A, C, A,...] }

现在我想合并每个组的 'seq' 值,其中 'stop' 中的下一个值和上一个值之间的差异等于 1。当差异很大时,例如 5 和 1610,这就是下一个集群开始的地方,并且很快。

我需要的是将每个集群中的所有值写入单独的行:

0 BBDAC   #join'stop' cluster 1-5  
1 CABAC   #join'stop' cluster 1610-1614

2 A....   #join'stop' cluster 2015 - ...
etc...

我现在的代码得到的是:

True   BDACABAC...
False  BCA...

对于整个巨大的数据框。

我理解它合并它的原因背后的逻辑,这符合我指定的条件(不完美,失去集群边缘),但如果我能以某种方式将它加入并正确拆分成集群,我就没有想法了,而不是所有行的数据框。

请在下面查看我的代码:

dfB = dfA.groupby((dfA.stop - dfA.stop.shift(1) == 1))['seq'].apply(lambda x: ''.join(x)).reset_index()

请帮忙。

PS 我也尝试了 diff() 的各种组合,但这也无济于事。我不确定 groupby 是否也适用于此解决方案。请指教!

dfC = dfA.groupby((dfA['stop'].diff(periods=1)))['seq'].apply(lambda x: ''.join(x)).reset_index() 

这以某种方式将数据帧分成更小的块,类似于集群,但我不理解它这样做的方式背后的逻辑,我知道结果没有意义,也不是我想要得到的。

标签: pandaspandas-groupbydifference

解决方案


Series我认为您需要为分组创建助手:

g = dfA['stop'].diff().ne(1).cumsum()
dfC = dfA.groupby(g)['seq'].apply(''.join).reset_index()
print (dfC)
   stop    seq
0     1  BBDAC
1     2  CABAC
2     3      A

详情

首先通过以下方式获得差异diff

print (dfA['stop'].diff())
0        NaN
1        1.0
2        1.0
3        1.0
4        1.0
5     1605.0
6        1.0
7        1.0
8        1.0
9        1.0
10    1301.0
Name: stop, dtype: float64

比较组的第一个值:ne (!=)

print (dfA['stop'].diff().ne(1))
0      True
1     False
2     False
3     False
4     False
5      True
6     False
7     False
8     False
9     False
10     True
Name: stop, dtype: bool

Asn 最后创建组cumsum

print (dfA['stop'].diff().ne(1).cumsum())
0     1
1     1
2     1
3     1
4     1
5     2
6     2
7     2
8     2
9     2
10    3
Name: stop, dtype: int32

推荐阅读