Pandas数据处理:高效筛选并保留DataFrame列中重复值的非首次出现行

碧海醫心
发布: 2025-08-06 14:52:15
原创
814人浏览过

Pandas数据处理:高效筛选并保留DataFrame列中重复值的非首次出现行

本文详细介绍了如何在Pandas DataFrame中筛选数据,以保留某一列中所有重复值的后续出现行,而排除其首次出现行。通过利用Pandas duplicated() 方法的默认行为配合布尔索引,可以简洁高效地实现这一常见数据清洗与分析需求。

在数据分析和处理过程中,我们经常会遇到需要识别并处理重复数据的情况。有时,我们可能希望保留所有重复项,但排除每个重复值首次出现的那一行,以便专注于后续的、可能代表某种变更或额外事件的数据记录。pandas库提供了强大的工具来轻松实现这一目标。

理解 pandas.Series.duplicated() 方法

实现这一需求的核心是 pandas.Series.duplicated() 方法。当应用于DataFrame的某一列(即一个Series)时,此方法会返回一个布尔Series,指示每个元素是否为重复项。其关键在于 keep 参数的默认行为:

  • keep='first' (默认值): 将除第一次出现之外的所有重复项标记为 True。这是我们当前需求所精确匹配的行为。
  • keep='last': 将除最后一次出现之外的所有重复项标记为 True。
  • keep=False: 将所有重复项(包括第一次和最后一次出现)都标记为 True。

由于我们的目标是保留所有重复项,但排除每个重复值首次出现的那一行,duplicated() 的默认 keep='first' 行为正好满足要求。它会将每个 client_id 首次出现的行标记为 False,而将其后续出现的重复行标记为 True。

示例与操作步骤

下面通过一个具体的例子来演示如何实现这一筛选过程。假设我们有一个包含客户ID、支付日期和支付金额的DataFrame:

import pandas as pd

# 原始DataFrame数据
data = {
    'client_id': ['067858', '168226', '141424', '141424', '151525', '168226', '067858', '151525'],
    'payment_date': ['2021-05-30', '2021-05-30', '2021-05-31', '2021-06-01', '2021-06-01', '2021-06-02', '2021-06-05', '2021-06-07'],
    'value': [140.0, 150.0, 100.0, 150.0, 150.0, 115.0, 143.0, 82.0]
}
df = pd.DataFrame(data)

# 将 payment_date 列转换为日期时间类型,以便更好的数据处理和展示
df['payment_date'] = pd.to_datetime(df['payment_date'])

print("原始DataFrame:")
print(df)
登录后复制

原始DataFrame如下所示:

原始DataFrame:
  client_id payment_date  value
0    067858   2021-05-30  140.0
1    168226   2021-05-30  150.0
2    141424   2021-05-31  100.0
3    141424   2021-06-01  150.0
4    151525   2021-06-01  150.0
5    168226   2021-06-02  115.0
6    067858   2021-06-05  143.0
7    151525   2021-06-07   82.0
登录后复制

现在,我们希望保留 client_id 列中所有重复项的后续出现行。例如,client_id 为 '141424' 的第一行是索引为 2 的记录,我们希望保留索引为 3 的记录。

要实现这一点,只需一行代码,利用 client_id 列的 duplicated() 方法并将其结果用于DataFrame的布尔索引:

# 应用 duplicated() 方法并进行布尔索引
# df['client_id'].duplicated() 会返回一个布尔Series,
# 其中所有 client_id 的第二次及以后出现的位置为 True,第一次出现的位置为 False。
df_filtered = df[df['client_id'].duplicated()]

print("\n筛选后的DataFrame (保留后续重复项):")
print(df_filtered)
登录后复制

执行上述代码后,我们将得到期望的输出:

筛选后的DataFrame (保留后续重复项):
  client_id payment_date  value
3    141424   2021-06-01  150.0
5    168226   2021-06-02  115.0
6    067858   2021-06-05  143.0
7    151525   2021-06-07   82.0
登录后复制

可以看到,所有 client_id 的首次出现行都被成功排除,只保留了它们的后续记录。

注意事项与扩展

  1. 多列重复判断: 如果需要基于多列的组合来判断重复项,可以将列名列表传递给 duplicated() 方法的 subset 参数。例如:
    # 基于 'client_id' 和 'payment_date' 两列判断重复
    df_multi_col_duplicates = df[df.duplicated(subset=['client_id', 'payment_date'])]
    登录后复制
  2. 保留所有重复项(包括首次): 如果你的需求是保留所有出现过重复的行(即,如果一个值出现超过一次,那么所有出现该值的行都保留),你可以使用 keep=False 参数:
    df_all_duplicates = df[df['client_id'].duplicated(keep=False)]
    登录后复制
  3. 与 drop_duplicates() 的区别 duplicated() 方法用于 标记 重复项,并通常与布尔索引结合使用来 选择 行。而 drop_duplicates() 方法则直接从DataFrame中 移除 重复行。两者虽然都处理重复数据,但用途和返回结果不同。

总结

利用 pandas.Series.duplicated() 方法及其默认的 keep='first' 参数,结合DataFrame的布尔索引,可以极其简洁高效地实现从DataFrame中筛选出并保留某一列中所有重复值的后续出现行。这种方法不仅代码量少,而且Pandas内部对这类操作进行了高度优化,使其在处理大型数据集时也能保持良好的性能。掌握这一技巧对于日常的数据清洗和预处理工作非常有帮助。

以上就是Pandas数据处理:高效筛选并保留DataFrame列中重复值的非首次出现行的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号