Python条件语句:为DataFrame新增不在Filtro_dia中的cuenta行
问题描述
我是Python新手,现有一段处理DataFrame的代码,需求如下:当bd_día中的"cuenta"不在Filtro_dia的"Cuenta"列表中时,需添加包含该"cuenta"及对应新值的新行。现有代码如下:
lista_datos = [] for i in range(bd_dia.shape[0]): # print(i) if list(bd_dia["cuenta"])[i] in list(Filtro_dia["Cuenta"]): lista_datos.append(Filtro_dia.iloc[i]) lista_datos[i][7] = bd_dia["ValorTotal"].iloc[i] else: if list(bd_dia["cuenta"])[i] not in list(Filtro_dia["Cuenta"]): nueva_fila = break;
完善后的代码及逻辑
原代码存在几个明显问题:break会直接终止循环,只能处理第一行;频繁转列表按索引取值效率低;修改视图数据可能引发警告。以下是修复并优化后的代码:
import pandas as pd lista_datos = [] # 将Filtro_dia的Cuenta列转为集合,大幅提升查找效率 cuentas_filtro = set(Filtro_dia["Cuenta"]) # 遍历bd_dia的每一行 for idx, row in bd_dia.iterrows(): cuenta_actual = row["cuenta"] valor_total = row["ValorTotal"] if cuenta_actual in cuentas_filtro: # 找到匹配的行,复制后修改第8列(索引7)的ValorTotal值 fila_coincidente = Filtro_dia[Filtro_dia["Cuenta"] == cuenta_actual].iloc[0].copy() fila_coincidente.iloc[7] = valor_total lista_datos.append(fila_coincidente) else: # 构造新行:沿用Filtro_dia的列结构,填充cuenta和对应ValorTotal nueva_fila = pd.Series(index=Filtro_dia.columns) nueva_fila["Cuenta"] = cuenta_actual nueva_fila.iloc[7] = valor_total # 若其他列需要默认值,可添加此行:nueva_fila.fillna(0, inplace=True) lista_datos.append(nueva_fila) # 可选:将结果列表转为DataFrame resultado_final = pd.DataFrame(lista_datos)
核心优化点
- 高效查找:用集合存储目标账号,查找时间复杂度从O(n)降至O(1),数据量大时优势明显
- 安全修改:复制匹配行后再修改,避免误改原
Filtro_dia的数据 - 简洁遍历:用
iterrows()直接获取每行数据,无需手动索引取值 - 结构一致:新行沿用
Filtro_dia的列结构,保证最终结果的列规范统一
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

