如何遍历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
相关产品推荐
相关产品推荐

