seleccionar - ¿Cómo obtengo una lista de todos los elementos duplicados que usan pandas en python?
seleccionar columnas de un dataframe pandas (4)
Tengo una lista de artículos que probablemente tenga algunos problemas de exportación. Me gustaría obtener una lista de los elementos duplicados para poder compararlos manualmente. Cuando trato de usar el método de pandas duplicado , solo devuelve el primer duplicado. ¿Hay alguna forma de obtener todos los duplicados y no solo el primero?
Una pequeña subsección de mi conjunto de datos se ve así:
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
Mi código se ve así actualmente:
df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols=''ID'')]
Hay un par de artículos duplicados. Pero, cuando uso el código anterior, solo obtengo el primer elemento. En la referencia de la API, veo cómo puedo obtener el último elemento, pero me gustaría tenerlos a todos para poder inspeccionarlos visualmente y ver por qué estoy obteniendo la discrepancia. Por lo tanto, en este ejemplo me gustaría obtener las tres entradas A036 y las 11795 entradas y cualquier otra entrada duplicada, en lugar de la primera. Cualquier ayuda es muy apreciada.
Con Pandas versión 0.17, puede establecer ''keep = False'' en la función duplicated para obtener todos los elementos duplicados.
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
Método n. ° 1: imprima todas las filas donde el ID es uno de los ID duplicados:
>>> 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
pero no pude pensar en una buena manera de evitar repetir ids
tantas veces. Prefiero el método n. ° 2: groupby
en la 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
Usando un elemento lógico o y estableciendo el argumento take_last del método duplicado de pandas en True y False puedes obtener un conjunto de tu dataframe que incluya todos los duplicados.
df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols=''ID'',take_last=False)|df_bigdata.duplicated(cols=''ID'',take_last=True)]
df[df.duplicated([''ID''], keep=False)]
devolverá todas las filas duplicadas a usted.
keep: {''primero'', ''último'', falso}, predeterminado ''primero''
- primero: Marcar duplicados como Verdadero, excepto para la primera ocurrencia.
- last: Mark se duplica como True excepto por la última ocurrencia.
- Falso: marque todos los duplicados como True.