
本教程详细介绍了如何使用 Pandas 高效地向现有 DataFrame 添加新数据,同时自动识别并移除重复项,并确保序列化的 ID 列能够正确更新。文章通过 `pd.concat` 和 `drop_duplicates` 的组合应用,展示了一种简洁且性能优越的数据处理方法,避免了传统迭代方式可能导致的索引和性能问题,确保数据完整性和一致性。
在数据处理和分析中,我们经常需要向现有数据集(通常以 Pandas DataFrame 的形式存在)添加新的记录。一个常见的挑战是,在添加新数据时,需要确保新记录不会与现有记录重复,并且如果数据中包含一个序列化的 ID 列,该列在添加新数据后仍能保持其连续性和正确性。本教程将介绍一种使用 Pandas 高效解决此问题的方法。
假设我们有一个包含 Id 和 Name 列的 DataFrame,其中 Id 是一个从0开始递增的唯一标识符。我们希望添加一个新项列表,但要排除那些 Name 值已经存在于 DataFrame 中的项,并在添加后重新生成连续的 Id。
传统上,一些用户可能会尝试通过迭代新项列表,并使用 df.append()(或其在 Pandas 2.0+ 中的替代方法 pd.concat([df, new_row_df]))逐行添加,然后再调用 df.drop_duplicates()。然而,这种方法存在几个问题:
Pandas 提供了一种更优雅、更高效的方法来处理这类场景,即结合使用 pd.concat() 进行数据合并,drop_duplicates() 进行去重,以及在去重后统一重置 Id 列。
首先,我们创建一个初始的 DataFrame 和要添加的新项列表。
import pandas as pd
# 初始 DataFrame
data = {'Id': [0, 1, 2, 3],
'Name': ['Alpha', 'Beta', 'Gamma', 'Delta']}
df_original = pd.DataFrame(data)
print("原始 DataFrame:")
print(df_original)
# 待添加的新项列表
items_to_add = ["Epsilon", "Beta", "Zeta"]
print("\n待添加的新项:", items_to_add)输出:
原始 DataFrame: Id Name 0 0 Alpha 1 1 Beta 2 2 Gamma 3 3 Delta 待添加的新项: ['Epsilon', 'Beta', 'Zeta']
为了使用 pd.concat(),我们需要将 items_to_add 列表转换为一个 DataFrame。
df_new_items = pd.DataFrame({"Name": items_to_add})
print("\n新项 DataFrame:")
print(df_new_items)输出:
新项 DataFrame:
Name
0 Epsilon
1 Beta
2 Zeta现在,我们将原始 DataFrame 和新项 DataFrame 合并,然后基于 Name 列进行去重。drop_duplicates(subset="Name") 将会检查 Name 列,并默认保留每个重复项的第一个出现。
# 合并原始 DataFrame 和新项 DataFrame
# 注意:这里不需要对df_new_items使用ignore_index=True,因为后续会重新设置Id列
df_combined = pd.concat([df_original, df_new_items])
# 基于 'Name' 列去重,保留第一次出现的记录
df_final = df_combined.drop_duplicates(subset="Name", keep='first')
print("\n合并并去重后的 DataFrame (Id尚未重置):")
print(df_final)输出:
合并并去重后的 DataFrame (Id尚未重置): Id Name 0 0 Alpha 1 1 Beta 2 2 Gamma 3 3 Delta 0 NaN Epsilon 2 NaN Zeta
解释: 可以看到,Beta 因为在 df_original 中已经存在,所以被去重了。Epsilon 和 Zeta 是新添加的,它们在合并后的 df_combined 中被保留。但由于 df_new_items 中没有 Id 列,pd.concat 会自动填充 NaN。这正是我们下一步需要解决的问题。
最后一步是为去重后的 DataFrame 重新生成一个连续的 Id 列。我们可以通过 range(len(df_final)) 来实现。
df_final["Id"] = range(len(df_final))
print("\n最终结果 DataFrame (Id已重置):")
print(df_final)输出:
最终结果 DataFrame (Id已重置): Id Name 0 0 Alpha 1 1 Beta 2 2 Gamma 3 3 Delta 4 4 Epsilon 5 5 Zeta
现在,Id 列已经正确地从0开始连续递增,并且所有重复的 Name 都已被移除。
import pandas as pd
# 1. 初始 DataFrame
data = {'Id': [0, 1, 2, 3],
'Name': ['Alpha', 'Beta', 'Gamma', 'Delta']}
df_original = pd.DataFrame(data)
print("原始 DataFrame:")
print(df_original)
# 2. 待添加的新项列表
items_to_add = ["Epsilon", "Beta", "Zeta"]
print("\n待添加的新项:", items_to_add)
# 3. 将新项转换为 DataFrame
df_new_items = pd.DataFrame({"Name": items_to_add})
# 4. 合并原始 DataFrame 和新项 DataFrame
df_combined = pd.concat([df_original, df_new_items])
# 5. 基于 'Name' 列去重,保留第一次出现的记录
df_final = df_combined.drop_duplicates(subset="Name", keep='first')
# 6. 重置 Id 列,确保其从0开始连续递增
df_final["Id"] = range(len(df_final))
print("\n最终处理结果:")
print(df_final)
# 如果需要保存到 CSV 文件
# df_final.to_csv('output.csv', index=False)通过结合使用 pd.concat() 进行高效的数据合并,drop_duplicates(subset="Name") 进行基于特定列的去重,以及 df["Id"] = range(len(df)) 进行 ID 列的重新序列化,我们可以优雅且高效地解决向 DataFrame 添加去重数据并维护连续 ID 的问题。这种方法不仅代码简洁,而且在处理大规模数据集时表现出卓越的性能。
以上就是Pandas 数据去重与ID序列化:高效向 DataFrame 添加新行的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号