pandas - 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()
这以某种方式将数据帧分成更小的块,类似于集群,但我不理解它这样做的方式背后的逻辑,我知道结果没有意义,也不是我想要得到的。
解决方案
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
推荐阅读
- firebase - 错误:意外的空值。扑火基地
- linux - gcc10 编译 c++ 代码并链接到 gcc11 编译的库
- r - R中的分层svyglm
- javascript - 如何在api调用nodejs的循环中实现多线程
- email - Odoo 12 - 系统参数 - 电子邮件营销 - 多域
- ios - 如何防止用户在 React Native IOS 应用程序中截屏?
- java - 如何在 Java 的一行代码中输入不同的变量?
- xcode - xcode 的语义调色板
- javascript - 单击 HTML 按钮时如何触发带有文本区域内容的文件下载
- javascript - JS - forEach 循环中的过滤器与拼接