You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历Pandas DataFrame行并按Path_ID拆分生成子DataFrame

高效拆分DataFrame为两个子表的方法

嘿,我明白你想要做的事——把包含特定列的大DataFrame按Path_ID拆分成两个结构不同的子DataFrame。首先得说,用iterrows()逐行循环确实能实现,但对于大数据量来说效率很低,Pandas本身提供了更简洁高效的批量操作方法,咱们来一步步看:

方法一:直接批量选择列(推荐,最快)

如果每个Path_ID对应的METER/LATITUDE_SM/LONGITUDE_SM是唯一的,且每个Path_ID对应的CELLID/lon/lat也是唯一的(看你的示例数据是这样的),那直接选择需要的列再去重就能得到目标子表:

生成第一个子DataFrame

import pandas as pd

# 假设你的原DataFrame叫df
df_sub1 = df[['Path_ID', 'METER', 'LATITUDE_SM', 'LONGITUDE_SM']].drop_duplicates(subset='Path_ID')
  • drop_duplicates(subset='Path_ID')确保每个Path_ID只保留一行,避免重复条目。

生成第二个子DataFrame

# 如果需要把列名lon改成Lon,就用rename;不需要的话直接选列即可
df_sub2 = df[['Path_ID', 'CELLID', 'lon', 'lat']].rename(columns={'lon': 'Lon'}).drop_duplicates(subset='Path_ID')

方法二:按Path_ID分组处理(适合需要逐组自定义逻辑的场景)

如果你确实需要对每个Path_ID做一些额外的自定义处理,那用groupby()比iterrows()高效得多:

sub1_data = []
sub2_data = []

# 按Path_ID分组遍历每个组
for path_id, group in df.groupby('Path_ID'):
    # 从每组中提取需要的字段(这里取第一行,因为每组的对应字段应该是一致的)
    sub1_row = {
        'Path_ID': path_id,
        'METER': group['METER'].iloc[0],
        'LATITUDE_SM': group['LATITUDE_SM'].iloc[0],
        'LONGITUDE_SM': group['LONGITUDE_SM'].iloc[0]
    }
    sub2_row = {
        'Path_ID': path_id,
        'CELLID': group['CELLID'].iloc[0],
        'Lon': group['lon'].iloc[0],  # 这里直接用Lon作为列名
        'lat': group['lat'].iloc[0]
    }
    
    sub1_data.append(sub1_row)
    sub2_data.append(sub2_row)

# 转成DataFrame
df_sub1 = pd.DataFrame(sub1_data)
df_sub2 = pd.DataFrame(sub2_data)

为什么不用iterrows()?

iterrows()会把每一行数据转换成Series对象,逐行迭代的速度很慢,当你的DataFrame有几万甚至几十万行时,这种方法的性能会很差。而Pandas的批量选择或groupby()都是基于底层的向量化操作,速度能提升几十甚至上百倍。

内容的提问来源于stack exchange,提问作者Rocky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:57