如何用df.iterrows()替代传统for循环处理DataFrame?
用df.iterrows()替代传统循环获取各TO_ID最小DURATION_H记录
你的原代码遍历1到len(df_A2C)的整数,但实际TO_ID并非连续值(比如示例数据里的TO_ID是7、26这类离散值),导致多数迭代会生成空DataFrame,需要额外判断。下面是用iterrows()实现需求的方法,自动避免空DataFrame问题:
方法1:用iterrows()收集行数据后筛选
# 创建字典存储每个TO_ID对应的所有行 to_id_rows = {} # 逐行遍历DataFrame for idx, row in df_A2C.iterrows(): to_id = row['TO_ID'] if to_id not in to_id_rows: to_id_rows[to_id] = [] to_id_rows[to_id].append(row) # 对每个TO_ID筛选DURATION_H最小的行 for to_id, rows in to_id_rows.items(): min_duration_row = min(rows, key=lambda x: x['DURATION_H']) print(min_duration_row)
这个方式通过iterrows()遍历所有有效行,只收集存在的TO_ID数据,自然不会出现空DataFrame的情况。
更高效的替代方案(适合大型DataFrame)
如果你的核心需求是获取每个TO_ID对应DURATION_H最小的记录,不建议用iterrows()——因为它在处理大型DataFrame时效率较低。更优的方式是用pandas内置的groupby+idxmin:
# 按TO_ID分组,提取每组DURATION_H最小的行 result_df = df_A2C.loc[df_A2C.groupby('TO_ID')['DURATION_H'].idxmin()] print(result_df)
这个方法完全避免循环,利用pandas的向量化操作,速度远快于迭代遍历,代码也更简洁。
内容的提问来源于stack exchange,提问作者user13373167
相关产品推荐
相关产品推荐

