如何使用 Python 中的 pandas 获取所有重复项目的列表?

2025-01-20 09:07:00
admin
原创
147
摘要:问题描述:我有一个项目列表,其中可能存在一些导出问题。我想获取重复项目的列表,以便可以手动比较它们。当我尝试使用 pandas duplicated 方法时,它只返回第一个重复项。有没有办法获取所有重复项而不仅仅是第一个重复项?我的数据集的一小部分如下所示:ID,ENROLLMENT_DATE,TRAINER...

问题描述:

我有一个项目列表,其中可能存在一些导出问题。我想获取重复项目的列表,以便可以手动比较它们。当我尝试使用 pandas duplicated 方法时,它只返回第一个重复项。有没有办法获取所有重复项而不仅仅是第一个重复项?

我的数据集的一小部分如下所示:

ID,ENROLLMENT_DATE,TRAINER_MANAGING,TRAINER_OPERATOR,FIRST_VISIT_DATE
1536D,12-Feb-12,"06DA1B3-Lebanon NH",,15-Feb-12
F15D,18-May-12,"06405B2-Lebanon NH",,25-Jul-12
8096,8-Aug-12,"0643D38-Hanover NH","0643D38-Hanover NH",25-Jun-12
A036,1-Apr-12,"06CB8CF-Hanover NH","06CB8CF-Hanover NH",9-Aug-12
8944,19-Feb-12,"06D26AD-Hanover NH",,4-Feb-12
1004E,8-Jun-12,"06388B2-Lebanon NH",,24-Dec-11
11795,3-Jul-12,"0649597-White River VT","0649597-White River VT",30-Mar-12
30D7,11-Nov-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",30-Nov-11
3AE2,21-Feb-12,"06405B2-Lebanon NH",,26-Oct-12
B0FE,17-Feb-12,"06D1B9D-Hartland VT",,16-Feb-12
127A1,11-Dec-11,"064456E-Hanover NH","064456E-Hanover NH",11-Nov-12
161FF,20-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",3-Jul-12
A036,30-Nov-11,"063B208-Randolph VT","063B208-Randolph VT",
475B,25-Sep-12,"06D26AD-Hanover NH",,5-Nov-12
151A3,7-Mar-12,"06388B2-Lebanon NH",,16-Nov-12
CA62,3-Jan-12,,,
D31B,18-Dec-11,"06405B2-Lebanon NH",,9-Jan-12
20F5,8-Jul-12,"0669C50-Randolph VT",,3-Feb-12
8096,19-Dec-11,"0649597-White River VT","0649597-White River VT",9-Apr-12
14E48,1-Aug-12,"06D3206-Hanover NH",,
177F8,20-Aug-12,"063B208-Randolph VT","063B208-Randolph VT",5-May-12
553E,11-Oct-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",8-Mar-12
12D5F,18-Jul-12,"0649597-White River VT","0649597-White River VT",2-Nov-12
C6DC,13-Apr-12,"06388B2-Lebanon NH",,
11795,27-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",19-Jun-12
17B43,11-Aug-12,,,22-Oct-12
A036,11-Aug-12,"06D3206-Hanover NH",,19-Jun-12

我的代码目前如下所示:

df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols='ID')]

有几个重复的项目。但是,当我使用上面的代码时,我只能得到第一个项目。在 API 参考中,我知道如何获取最后一个项目,但我希望获得所有项目,这样我就可以直观地检查它们,看看为什么会出现差异。因此,在这个例子中,我希望获取所有三个 A036 条目和两个 11795 条目以及任何其他重复的条目,而不仅仅是第一个。任何帮助都非常感谢。


解决方案 1:

方法#1:打印所有ID为重复ID之一的行:

>>> import pandas as pd
>>> df = pd.read_csv("dup.csv")
>>> ids = df["ID"]
>>> df[ids.isin(ids[ids.duplicated()])].sort_values("ID")
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

但我想不出一个好办法来避免重复ids这么多次。我更喜欢方法 2:groupby在 ID 上。

>>> pd.concat(g for _, g in df.groupby("ID") if len(g) > 1)
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

解决方案 2:

使用 Pandas 0.17 版本,您可以在duplicated函数中设置“keep = False”来获取所有重复项目。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(['a','b','c','d','a','b'])

In [3]: df
Out[3]: 
       0
    0  a
    1  b
    2  c
    3  d
    4  a
    5  b

In [4]: df[df.duplicated(keep=False)]
Out[4]: 
       0
    0  a
    1  b
    4  a
    5  b

解决方案 3:

df[df.duplicated(['ID'], keep=False)]

它会将所有重复的行返回给您。

根据文献:

keep:{'first','last',False},默认'first'

  • 'first' :除第一次出现外,将重复项标记为 True。

  • 'last' :除最后一次出现的情况外,将重复项标记为 True。

  • False :将所有重复项标记为 True。

解决方案 4:

由于我无法发表评论,因此作为单独的答案发布

要根据多列查找重复项,请按如下所示输入每列名称,它将返回所有重复的行集:

df[df[['product_uid', 'product_title', 'user']].duplicated() == True]

或者,

df[df[['product_uid', 'product_title', 'user']].duplicated()]

解决方案 5:

df[df['ID'].duplicated() == True]

这对我有用

解决方案 6:

sort("ID")现在似乎不起作用,根据排序文档似乎已被弃用,因此sort_values("ID")改为使用在重复过滤器后进行排序,如下所示:

df[df.ID.duplicated(keep=False)].sort_values("ID")

解决方案 7:

您可以使用:

df[df.duplicated(['ID'])==True].sort_values('ID')

所有列值的重复行及其索引位置 #

def dup_rows_index(df):
  dup = df[df.duplicated()]
  print('Duplicated index loc:',dup[dup == True ].index.tolist())
  return dup

解决方案 8:

这可能不是问题的解决方案,但可以举例说明:

import pandas as pd

df = pd.DataFrame({
    'A': [1,1,3,4],
    'B': [2,2,5,6],
    'C': [3,4,7,6],
})

print(df)
df.duplicated(keep=False)
df.duplicated(['A','B'], keep=False)

输出:

   A  B  C
0  1  2  3
1  1  2  4
2  3  5  7
3  4  6  6

0    False
1    False
2    False
3    False
dtype: bool

0     True
1     True
2    False
3    False
dtype: bool

解决方案 9:

使用逐元素逻辑或并将 pandas duplicated 方法的 take_last 参数设置为 True 和 False,您可以从数据框中获取包含所有重复项的集合。

df_bigdata_duplicates = 
    df_bigdata[df_bigdata.duplicated(cols='ID', take_last=False) |
               df_bigdata.duplicated(cols='ID', take_last=True)
              ]

解决方案 10:

因为我的数据库.duplicated(keep=False)只有在对列进行排序后才可以工作。

data.sort_values(by=['Order ID'], inplace=True)
df = data[data['Order ID'].duplicated(keep=False)]

解决方案 11:

此代码为您提供一个数据框,指示某一行在数据框中是否有重复:

df2 = df1.duplicated()

此代码消除了重复并仅保留一个实例:

df3 = df1.drop_duplicates(keep="first")

df3将是一个由唯一项目(行)组成的数据框。

解决方案 12:

总结

这对我有用:

dups = [i for i, v in df["Col1"].value_counts().iteritems() if v > 1]
dups

输出:

[501, 505]

列出重复的行:

fltr = df["Col1"].isin(dups)  # Filter
df[fltr]

输出:

   Col1  Col2
0   501     D
1   501     H
2   505     E
3   501     E
4   505     M

解释:

value_counts()一列,比如Col1,返回以下Series内容:

  1. 以列数据Col1作为Series索引。

  2. 将值的数量Col1作为Series值。

例如value_counts()以下内容DataFrame

列1Col2
0501
1501
2505
3501
4505
5502一个
6503
df["Col1"].value_counts()

输出如下Series

501    3
505    2
502    1
503    1
Name: Col1, dtype: int64

现在iteritems()我们可以访问对象的索引和值Series

dups = [i for i, v in df["Col1"].value_counts().iteritems() if v > 1]
dups

输出:

[501, 505]

现在使用捕获的重复值作为原始值的过滤器DataFrame

fltr = df["Col1"].isin(dups)  # Filter
df[fltr]
   Col1  Col2
0   501     D
1   501     H
2   505     E
3   501     E
4   505     M

解决方案 13:

受上述解决方案的启发,您可以进一步对值进行排序,以便查看重复排序的记录:

df[df.duplicated(['ID'], keep=False)].sort_values(by='ID')
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用