如何使用pandas对各分组的滑动窗口内字符串进行拼接?
实现方法
Pandas的rolling方法支持自定义函数处理非数值类型计算,你可以通过分组+滚动窗口自定义拼接逻辑+位移的方式实现需求,完全符合你给出的预期输出。
完整可运行代码
import pandas as pd # 构造测试数据集 data = { 'cluster': [1,1,1,1,1,2,2,2,2,2,2,2,2], 'order': [1,2,3,4,5,1,2,3,4,5,6,7,8], 'label': ['a','b','c','c','b','b','b','c','a','a','b','c','c'] } df = pd.DataFrame(data) # 若原始数据顺序不确定,必须先按cluster+order升序排序,避免拼接结果错误 df = df.sort_values(['cluster', 'order']).reset_index(drop=True) # 核心计算逻辑 df['roll3'] = df.groupby('cluster', group_keys=False)['label']\ .apply(lambda s: s.rolling(3).apply(lambda x: ''.join(x), engine='python').shift(1))
逻辑说明
- 按
cluster分组,每个分组单独处理避免跨集群的窗口拼接 - 对分组内的
label列开大小为3的滚动窗口,用自定义join函数拼接窗口内的三个字符串 - 用
shift(1)将拼接结果整体向下位移1行,实现取当前行之前的3个前序值拼接的需求,前3行自然为NaN - 加
engine='python'是为了兼容不同Pandas版本,避免默认numba引擎不支持字符串操作的报错
输出验证
打印df即可得到你给出的预期结果:
| cluster | order | label | roll3 | |
|---|---|---|---|---|
| 0 | 1 | 1 | a | NaN |
| 1 | 1 | 2 | b | NaN |
| 2 | 1 | 3 | c | NaN |
| 3 | 1 | 4 | c | abc |
| 4 | 1 | 5 | b | bcc |
| 5 | 2 | 1 | b | NaN |
| 6 | 2 | 2 | b | NaN |
| 7 | 2 | 3 | c | NaN |
| 8 | 2 | 4 | a | bbc |
| 9 | 2 | 5 | a | bca |
| 10 | 2 | 6 | b | caa |
| 11 | 2 | 7 | c | aab |
| 12 | 2 | 8 | c | abc |
内容的提问来源于stack exchange,提问作者Gavin
相关产品推荐
相关产品推荐

