Как получить список всех повторяющихся элементов с помощью pandas в python?
У меня есть список элементов, которые, вероятно, имеют некоторые проблемы с экспортом. Я хотел бы получить список дубликатов, чтобы сравнить их вручную. Когда я пытаюсь использовать 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
Мой код выглядит так:
df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols='ID')]
В области есть несколько дублирующих элементов. Но, когда я использую вышеуказанный код, я получаю только первый элемент. В ссылке API я вижу, как я могу получить последний элемент, но я хотел бы иметь все, чтобы я мог визуально осмотреть их, чтобы понять, почему я получаю несоответствие. Итак, в этом примере я хотел бы получить все три записи A036 и как 11795 записей, так и любые другие дублированные записи вместо первого. Любая помощь наиболее ценится.
Ответы
Ответ 1
Способ №1: напечатать все строки, в которых идентификатор является одним из идентификаторов в дублированном формате:
>>> 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
столько раз. Я предпочитаю метод # 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 вы можете установить 'keep = False' в duplicated, чтобы получить все повторяющиеся элементы.
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: Mark дублирует как True, за исключением первого вхождения.
- last: Mark дублирует как True, за исключением последнего вхождения.
- False: пометить все дубликаты как True.
Ответ 4
df[df['ID'].duplicated() == True]
Это сработало для меня
Ответ 5
Используя логику элемента или логический аргумент take_last для дублированного метода pandas как для True, так и для False, вы можете получить набор из вашего фрейма данных, который включает все дубликаты.
df_bigdata_duplicates =
df_bigdata[df_bigdata.duplicated(cols='ID', take_last=False) |
df_bigdata.duplicated(cols='ID', take_last=True)
]
Ответ 6
Поскольку я не могу комментировать, поэтому размещать как отдельный ответ
Чтобы найти дубликаты на основе более чем одного столбца, укажите имя каждого столбца, как показано ниже, и он вернет вам все наборы дублированных строк:
df[df[['product_uid', 'product_title', 'user']].duplicated() == True]
Ответ 7
Это не может быть решением вопроса, но для иллюстрации примеров:
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
Ответ 8
df[df.duplicated(['ID'])==True].sort_values('ID')
Ответ 9
sort("ID")
, кажется, не работает сейчас, кажется устаревшим согласно sort doc, поэтому вместо сортировки после дублирующего фильтра используйте sort_values("ID")
, как показано ниже:
df[df.ID.duplicated(keep=False)].sort_values("ID")