Pandas DataFrame中按逐行条件判断插入新行的实现方案
Pandas 条件匹配后行插入的可落地方案
核心实现逻辑:避免直接迭代修改原DataFrame(易出现索引错位、迭代异常问题),改为逐行遍历原表时,按顺序收集「原行+符合条件的新行」到列表中,最后统一合并为新DataFrame。
第一步:修正现有辅助函数
当前编写的create_new_row存在两个问题:
- 不满足判定条件时
result变量未定义,会抛出异常 - 仅返回计算后的列B值,没有生成完整的新行结构
修正后的函数逻辑:
import pandas as pd def create_new_row(row): # 满足判定条件时生成完整新行 if row['A'] == "Both" and row['B'] < 1000: # 替换为实际的自定义计算逻辑,示例为原B值加100 new_b = row['B'] + 100 # 新行的A、C列与原行完全一致,沿用原行列结构 return pd.Series([row['A'], new_b, row['C']], index=row.index) # 不满足条件返回空值,方便后续过滤 return None
第二步:逐行收集并生成新DataFrame
按顺序遍历原表,先存入当前原行,再判断是否需要插入新行:
# 替换为实际使用的原DataFrame df = pd.DataFrame({ 'A': ['Both', 'London', 'Manchester', 'Both'], 'B': [999, 1002, 1005, 1001], 'C': ['LP', 'KI', 'BV', 'IG'] }) # 初始化行存储列表 rows_container = [] # 逐行遍历原表,不做任何修改 for _, original_row in df.iterrows(): # 先将当前原行加入列表 rows_container.append(original_row) # 调用辅助函数生成符合条件的新行 target_new_row = create_new_row(original_row) # 有有效新行则追加到列表 if target_new_row is not None: rows_container.append(target_new_row) # 合并所有行,重置索引避免重复 final_df = pd.DataFrame(rows_container).reset_index(drop=True)
结果验证
运行上述代码后,得到的final_df完全符合预期:
A B C 0 Both 999 LP 1 Both 1099 LP 2 London 1002 KI 3 Manchester 1005 BV 4 Both 1001 IG
注意事项
- 只需要把
create_new_row里的new_b赋值逻辑替换为对应自定义计算函数的调用即可,其余逻辑无需调整 - 该方案不会打乱原有行的相对顺序,相比按索引位置插入的方法稳定性更高,适配大规模DataFrame场景
内容的提问来源于stack exchange,提问作者Alessandrini
相关产品推荐
相关产品推荐

