使用For循环向Pandas DataFrame追加行报错,求解决方法
解决Pandas DataFrame逐行追加的问题
为啥报错?
Pandas 2.0及以后的版本已经移除了DataFrame.append()方法,所以你运行代码时会触发AttributeError: 'DataFrame' object has no attribute 'append'。之前的append方法不仅和列表append逻辑不同,效率还很低,所以官方直接将其弃用删除了。
替代方法
1. 先攒审批通过的行,再合并(推荐,效率高)
别在循环里反复修改df2,先把符合条件的行存到列表里,最后一次性合并,性能好很多:
import pandas as pd df1 = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], }, index=[0, 1, 2, 3], ) approved_rows = [] for i in range(len(df1)): row = df1.iloc[i] # 这里加你的审批逻辑,比如判断某列值是否符合要求 # 举个例子:假设A列不是"A2"就算审批通过 if row["A"] != "A2": approved_rows.append(row) # 把攒的行合并成df2 df2 = pd.concat(approved_rows, axis=1).T.reset_index(drop=True)
2. 循环里逐行追加(适合数据量小的场景)
如果一定要在循环里实时更新df2,可以用pd.concat()每次合并单行:
import pandas as pd df1 = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], }, index=[0, 1, 2, 3], ) df2 = pd.DataFrame() for i in range(len(df1)): row = df1.iloc[i] # 审批逻辑,比如B列是"B1"就通过 if row["B"] == "B1": # 把单行转成DataFrame再合并,ignore_index避免索引混乱 df2 = pd.concat([df2, pd.DataFrame([row])], ignore_index=True)
3. 用loc直接赋值
如果提前知道df2的列名,也可以用loc直接加行:
import pandas as pd df1 = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], }, index=[0, 1, 2, 3], ) # 先初始化df2的列,和df1保持一致 df2 = pd.DataFrame(columns=df1.columns) for i in range(len(df1)): row = df1.iloc[i] # 审批逻辑,比如C列是"C0"就通过 if row["C"] == "C0": # 用当前df2的行数作为新行的索引,直接赋值 df2.loc[len(df2)] = row.values
小提醒
- 循环操作DataFrame效率很低,如果数据量大,一定要用第一种“攒列表再合并”的方式。
- 用
pd.concat的时候记得加ignore_index=True,不然会保留原来的索引,容易出问题。
内容的提问来源于stack exchange,提问作者Amir Zarbakhsh
相关产品推荐
相关产品推荐

