Python中如何用Pandas无过多循环为x列对象生成转移字符串
实现方案
用Pandas内置的分组聚合能力就能简洁实现需求,全程不需要写多层Python层循环,最终生成的转移字符串可以和原表行自动对齐。
具体实现代码
# 按x列分组,保留原表的分组出现顺序,聚合每个对象的s列转移序列 trans_map = ( df .groupby('x', sort=False) .agg(trans_str=('s', lambda col: '->'.join(map(str, col)))) ) # 将生成的转移字符串映射回原表,新增new列 df['new'] = df['x'].map(trans_map['trans_str'])
细节说明
- 这套写法完全避开了你原代码里逐行遍历、每一行都全表扫描匹配的低效问题,所有聚合计算都是Pandas底层的向量化运算,百万行级别的数据也能快速跑完
- 生成的new列和原表行数完全匹配,每一行的x值会自动匹配所属对象的转移字符串,不会出现你之前输出里相同对象反复重复冗余记录的问题
- 注意:如果原表中同一个x的行没有按照状态转移的先后顺序排列,拼接出来的字符串顺序会出错,需要在分组前先按时间/顺序字段给表排好序,比如执行
df = df.sort_values(by=['x', 'sort_time']),保证s列的序列就是真实的转移顺序。
原代码的问题根因
你之前逐行遍历x列的取值,每遍历一个值就全表筛选一次对应x的s列、拼接字符串、构造字典append到列表里,自然会出现4个a的行就重复4次a的字符串、2个b的行重复2次b的字符串的冗余结果——本质是没有把聚合好的分组结果和原表索引做映射对齐,而是逐行重复构造记录,既慢又有冗余。
内容的提问来源于stack exchange,提问作者K_Raikar
相关产品推荐
相关产品推荐

