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

Big*_*ome 81 python pandas

我有一个可能有一些出口问题的项目列表.我想获得重复项目的列表,以便我可以手动比较它们.当我尝试使用pandas 重复方法时,它只返回第一个副本.有没有办法获得所有的重复,而不仅仅是第一个?

我的数据集的一小部分看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

我的代码目前看起来像这样:

df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols='ID')]
Run Code Online (Sandbox Code Playgroud)

区域有几个重复的项目.但是,当我使用上面的代码时,我只得到第一项.在API参考中,我看到了如何获得最后一项,但我想拥有所有这些项目,以便我可以直观地检查它们,看看为什么我会遇到这种差异.所以,在这个例子中,我想获得所有三个A036条目以及11795个条目和任何其他重复条目,而不是第一个条目.任何帮助都非常感谢.

DSM*_*DSM 125

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

>>> import pandas as pd
>>> df = pd.read_csv("dup.csv")
>>> ids = df["ID"]
>>> df[ids.isin(ids[ids.duplicated()])].sort("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
Run Code Online (Sandbox Code Playgroud)

但我想不出一个防止重复ids这么多次的好方法.我更喜欢方法#2:groupbyID.

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 方法#2非常完美!非常感谢. (9认同)
  • 如果没有重复项,方法 #2 将失败(“没有要连接的对象”) (5认同)
  • @ user77005你可能已经想到了,但是为了每个人的利益,它的内容如下:`g for(占位符,g)在df.groupby('bla')中如果'bla'`; 下划线是占位符不可避免的参数的典型符号,我们不希望将它用于类似lambda的表达式中的任何内容. (5认同)
  • 方法#1需要更新:对于DataFrames,不推荐使用`sort`,而选择`sort_values`或`sort_index` [相关SO Q&A](/sf/ask/3088671211/无属性排序) (5认同)
  • g代表_的作用是什么? (3认同)

use*_*666 98

使用Pandas版本0.17,您可以在重复的函数中设置'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
Run Code Online (Sandbox Code Playgroud)

  • 宾果,有答案.所以:str或str或boolean ...奇怪的API选择."'all'`将更符合逻辑和直观的IMO. (2认同)
  • @Jarad你不觉得“keep=False”的意思是“是的,保留一切”很直观吗?奇怪的。/秒 (2认同)

小智 65

df[df.duplicated(['ID'], keep=False)]
Run Code Online (Sandbox Code Playgroud)

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

参考

保持:{'first','last',False},默认'first'

  • first:除第一次出现外,将重复标记为True.
  • last:标记重复为True,除了最后一次出现.
  • 错误:将所有重复项标记为True.

  • df [df ['ID']。duplicated()== True]这将返回所有重复项 (2认同)

Dee*_*pak 13

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

要在多列的基础上查找重复项,请提及每个列名,如下所示,它将返回所有重复的行集:

df[df[['product_uid', 'product_title', 'user']].duplicated() == True]
Run Code Online (Sandbox Code Playgroud)


Har*_*sad 6

df[df['ID'].duplicated() == True]
Run Code Online (Sandbox Code Playgroud)

这对我有用

  • 你实际上不必添加`== True`,`.duplicate()`已经返回bool数组。 (9认同)

Naf*_*shi 6

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

df[df.ID.duplicated(keep=False)].sort_values("ID")
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以使用:

df[df.duplicated(['ID'])==True].sort_values('ID')
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请问您能用更详细的解释来扩展您的答案吗?这对于理解非常有用。谢谢你! (4认同)