我有一份可能有出口问题的商品清单。我想获得重复项目的列表,以便我可以手动比较它们。当我尝试使用熊猫复制方法时,它只返回第一个副本。有没有办法得到所有的副本,而不只是第一个?

我的数据集的一小部分是这样的:

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条目以及任何其他重复条目,而不仅仅是第一个条目。任何帮助都非常感激。


当前回答

对于我的数据库,.duplicate (keep=False)在列排序之前不起作用。

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

其他回答

sort("ID")现在似乎不工作,似乎不赞成按排序文档,所以使用sort_values("ID")而不是在重复过滤器后排序,如下所示:

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

博士TL;

这招对我很管用:

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:

列Col1的数据作为级数索引。 将Col1中的值计数为级数值。

例如DataFrame下面的value_counts():

Col1 Col2
0 501 D
1 501 H
2 505 E
3 501 E
4 505 M
5 502 A
6 503 N
df["Col1"].value_counts()

输出:

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
df[df.duplicated(['ID'], keep=False)]

它会把所有复制的行返回给你。

根据文件:

keep: {' first ', ' last ', False},默认' first ' 'first':除第一次出现外,标记重复为True。 'last':除最后一次出现外,标记重复为True。 False:将所有副本标记为True。

方法#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

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

>>> 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

使用元素逻辑或并将pandas duplicate方法的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)
              ]