파이썬에서 팬더를 사용하여 모든 중복 항목 목록을 얻으려면 어떻게해야합니까?


127

수출 문제가있을 가능성이있는 품목 목록이 있습니다. 수동으로 비교할 수 있도록 중복 항목의 목록을 얻고 싶습니다. pandas duplicated method 를 사용하려고 하면 첫 번째 복제본 만 반환됩니다. 첫 번째가 아닌 모든 중복을 얻을 수있는 방법이 있습니까?

내 데이터 세트의 작은 하위 섹션은 다음과 같습니다.

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 참조에서 마지막 항목을 얻을 수있는 방법을 볼 수 있지만 모든 항목을 가져 와서 시각적으로 검사하여 불일치가 발생하는 이유를 확인하고 싶습니다. 따라서이 예에서는 첫 번째 항목 대신 3 개의 A036 항목과 11795 항목 및 기타 중복 항목을 모두 가져오고 싶습니다. 도움을 주시면 감사하겠습니다.


1
"중복"은 여러 가지를 의미 할 수 있습니다. "귀하의 경우 에는"여러 열 또는 모든 열에서 동일한 행 "이 아닌 단일 열의 중복ID 만 고려하려고합니다 .
smci

답변:


170

방법 # 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

하지만 ids그렇게 여러 번 반복되는 것을 막을 수있는 좋은 방법을 생각할 수 없었 습니다. 나는 groupbyID에 방법 # 2를 선호합니다 .

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

11
방법 # 2는 완벽합니다! 정말 고맙습니다.
BigHandsome 2013

4
중복이없는 경우 방법 # 2 실패 ( "연결할 개체 없음")
CPBL

4
무엇을 g for _ 합니까?
user77005

5
@ user77005 당신은 이미 알아 냈을지도 모르지만 모두의 이익을 위해 다음과 같이 읽습니다. g for (placeholder, g) in df.groupby('bla') if 'bla'; 밑줄은 람다와 같은 표현의 어떤 것도 사용하고 싶지 않은 불가피한 인수의 자리 표시 자에 대한 일반적인 기호입니다.
stucash

7
방법 # 1을 업데이트해야 sort합니다. sort_values또는 sort_index Related SO Q & A를
tatlar

138

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

3
빙고, 답이 있습니다. 그래서 : str 또는 str 또는 boolean ... 이상한 API 선택. 'all'더 논리적이고 직관적 인 IMO가 될 것입니다.
Jarad

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

중복 된 모든 행을 반환합니다.

문서 에 따르면 :

keep : { 'first', 'last', False}, 기본값 'first'

  • first : 첫 번째 발생을 제외하고 중복 항목을 True로 표시합니다.
  • last : 마지막 항목을 제외하고 중복 항목을 True로 표시합니다.
  • False : 모든 중복 항목을 True로 표시합니다.

@dreme 이것은 구문 적으로 정확하지 않으며 작동하지 않습니다. ']'가 일치하지 않으며 필요한 항목도 반환하지 않습니다. 짧지 만 잘못되었습니다.
FinancialRadDeveloper

두 가지 측면에서 모두 @FinancialRadDeveloper의 말이 맞습니다. 댓글을 삭제하겠습니다. 오류를 찾아 주셔서 감사합니다.
dreme

3
df [df [ 'ID']. duplicated () == True] 모든 중복 항목을 반환합니다
Hariprasad

12

댓글을 달 수 없으므로 별도의 답변으로 게시

둘 이상의 열을 기준으로 중복을 찾으려면 모든 열 이름을 아래와 같이 언급하면 ​​모든 중복 행 집합이 반환됩니다.

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

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

이것은 나를 위해 일했습니다.


2
당신은 실제로 추가 할 필요가 없습니다 == True, .duplicated()이미 부울 배열을 반환합니다.
Jakub Wagner

3

요소 별 논리를 사용하거나 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)
              ]

2

이것은 질문에 대한 해결책이 아니라 예를 설명하기위한 것입니다.

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

2

sort("ID")지금 작동하지 않는 것 같고 sort doc에 따라 더 이상 사용되지 않는 것 같습니다. sort_values("ID")대신 다음과 같이 중복 필터 후 정렬을 사용하십시오 .

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

2

내 데이터베이스에 대해 duplicated (keep = False)는 열이 정렬 될 때까지 작동하지 않았습니다.

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

1

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


4
더 자세한 설명으로 답변을 연장 할 수 있습니까? 이것은 이해에 매우 유용합니다. 감사합니다!
vezunchik

Stack Overflow에 오신 것을 환영합니다. 기여해 주셔서 감사합니다! 설명으로 답변을 연장 할 수 있다면 친절 할 것입니다. 여기 에 좋은 답변을 제공하는 방법에 대한 가이드가 있습니다. 감사!
David
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.