如何高效在Pandas DataFrame中识别跨RING的CIRCUIT关联CLLI
高效解决Pandas跨RING CIRCUIT的NeighbourCLLI生成问题
针对你的50万行数据集,绝对不要用逐行迭代,Pandas的分组和矢量化操作能把速度提升几个数量级。下面是直接可用的原生解决方案,核心思路是通过groupby批量处理每个CIRCUIT的关联数据:
实现步骤与代码
假设你的DataFrame名为df,包含RING、CLLI、RR、root、CIRCUIT列:
import pandas as pd def process_circuit_group(group): # 为当前CIRCUIT构建「RING对应CLLI」的映射字典 ring_to_clli = group.set_index('RING')['CLLI'].to_dict() # 如果当前CIRCUIT只对应一个RING,直接设为NaN if len(ring_to_clli) == 1: group['NeigbourCLLI'] = pd.NA return group # 对组内每一行,筛选出非当前RING的CLLI并合并为字符串 group['NeigbourCLLI'] = group['RING'].apply( lambda current_ring: ','.join( [clli for ring, clli in ring_to_clli.items() if ring != current_ring] ) ) return group # 按CIRCUIT分组处理,直接更新原DataFrame df = df.groupby('CIRCUIT', group_keys=False).apply(process_circuit_group)
为什么这个方法高效?
- 批量分组处理:每个CIRCUIT只被处理一次,避免了逐行迭代时重复查询整个数据集的开销;
- 底层优化:
groupby和apply的底层是Pandas优化过的C级实现,比Python层面的循环快得多; - 逻辑精准:先判断CIRCUIT是否跨RING,再生成对应值,无多余计算。
效果示例
假设原数据如下:
| RING | CLLI | CIRCUIT |
|---|---|---|
| R1 | CLLI1 | CIR1 |
| R2 | CLLI2 | CIR1 |
| R1 | CLLI3 | CIR2 |
| R1 | CLLI4 | CIR2 |
| R3 | CLLI5 | CIR3 |
处理后新增列结果:
| RING | CLLI | CIRCUIT | NeigbourCLLI |
|---|---|---|---|
| R1 | CLLI1 | CIR1 | CLLI2 |
| R2 | CLLI2 | CIR1 | CLLI1 |
| R1 | CLLI3 | CIR2 | NaN |
| R1 | CLLI4 | CIR2 | NaN |
| R3 | CLLI5 | CIR3 | NaN |
内容的提问来源于stack exchange,提问作者user14073111
相关产品推荐
相关产品推荐

