Skip to content

Pandas DataFrame 追加行的最佳替代方法

随着 Pandas 1.4.0 版本的发布,曾经广泛使用的 .append() 方法已被标记为弃用。本文提供了多种有效的替代方案来向 DataFrame 添加单行或多行数据。

为什么 .append() 方法被弃用

性能问题

Pandas 的 .append() 方法在实际操作中会创建整个 DataFrame 的完整副本,然后添加新行。对于大型数据集,这种操作的性能代价非常高,特别是需要多次追加数据时。

官方建议使用 pd.concat() 来代替,因为它提供了更好的性能和更明确的语义。

推荐替代方案

方法一:使用 pd.concat() (最直接的替代)

python
import pandas as pd

# 创建空DataFrame
df = pd.DataFrame(columns=['a', 'b'])

# 创建新行的DataFrame并合并
new_row = pd.DataFrame({'a': [1], 'b': [2]})
df = pd.concat([df, new_row], ignore_index=True)

TIP

使用 ignore_index=True 可以确保索引被重新编号,避免索引冲突。

方法二:字典转DataFrame后合并 (一行代码版本)

python
# 单行代码实现
df = pd.concat([df, pd.DataFrame.from_records([{'a': 1, 'b': 2}])], ignore_index=True)

方法三:使用 .loc 索引器 (适用于顺序索引)

python
# 使用len(df)获取下一个索引位置
df.loc[len(df), ['a', 'b']] = 1, 2

# 或者使用字典赋值
df.loc[len(df)] = {'a': 1, 'b': 2}

注意事项

.loc 方法会直接修改原DataFrame,不会创建副本。确保索引是正确的,避免覆盖现有数据。

方法四:自定义追加函数 (提高代码可读性)

python
def append_dict_to_df(df, dict_to_append):
    """向DataFrame追加字典行"""
    return pd.concat([df, pd.DataFrame.from_records([dict_to_append])], ignore_index=True)

# 使用示例
df = append_dict_to_df(df, {'a': 1, 'b': 2})

性能优化建议

批量处理数据

最佳实践

避免在循环中频繁追加单行数据,这会显著降低性能。相反,应该收集所有需要添加的数据,然后一次性创建DataFrame。

python
# 不推荐:在循环中多次追加
rows = []
for i in range(1000):
    # 收集数据而不是直接追加
    rows.append({'a': i, 'b': i*2})
    
# 一次性创建DataFrame
df = pd.DataFrame.from_records(rows)

使用列表预先收集数据

python
# 创建空列表收集数据
data_list = []

# 在循环中添加字典
data_list.append({'a': 1, 'b': 2})
data_list.append({'a': 3, 'b': 4})

# 一次性创建DataFrame
df = pd.DataFrame.from_records(data_list)

高级用法

处理指定索引的情况

python
# 指定特定索引值
index_value = 'row_1'
df = pd.concat([df, pd.DataFrame({'a': 1, 'b': 2}, index=[index_value])])

在方法链中使用追加操作

python
df = (
    pd.DataFrame(columns=['a', 'b'])
    .pipe(lambda d: pd.concat([d, pd.DataFrame({'a': [1], 'b': [2]})], ignore_index=True))
)

总结对比

方法优点缺点适用场景
pd.concat()官方推荐,性能好代码稍微冗长大多数场景
.loc索引器代码简洁需要确保索引正确顺序索引的数据
批量创建性能最佳需要预先收集数据大量数据追加
自定义函数提高可读性增加代码量需要多次追加的场景

迁移建议

.append() 迁移时,优先考虑 pd.concat() 方法,它是最接近官方推荐的替代方案,并且提供了最佳的兼容性和性能。

选择合适的方法取决于你的具体使用场景和数据规模。对于大多数情况,使用 pd.concat() 是最安全的选择,而在需要高性能处理的场景中,预先收集数据并批量创建DataFrame是最佳实践。