Aquí un ejemplo:

import pandas as pd
df = pd.DataFrame({
    'product':['1','1','1','2','2','2','3','3','3','4','4','4','5','5','5'],
    'value':['a','a','a','a','a','b','a','b','a','b','b','b','a','a','a']
})

      product value
0        1     a
1        1     a
2        1     a
3        2     a
4        2     a
5        2     b
6        3     a
7        3     b
8        3     a
9        4     b
10       4     b
11       4     b
12       5     a
13       5     a
14       5     a

Necesito salida:

1 a
4 b
5 a

Debido a que los valores de 'valor' para distintos valores de 'producto' son todos iguales, lamento el mal inglés

0
Contra111 4 oct. 2019 a las 13:04

3 respuestas

La mejor respuesta

Creo que necesitas esto

m=df.groupby('product')['value'].transform('nunique')
df.loc[m==1].drop_duplicates(). reset_index(drop=True)

Salida

   product  value
0   1        a
1   4        b
2   5        a

Detalles df.groupby('product')['value'].transform('nunique') devuelve una serie de la siguiente manera

0     1
1     1
2     1
3     2
4     2
5     2
6     2
7     2
8     2
9     1
10    1
11    1
12    1
13    1
14    1

Donde los números del número de valores únicos en cada grupo. Luego usamos df.loc para obtener solo las filas en las que este valor es 1, entonces, los grupos con valores únicos.

Luego soltamos duplicados, ya que solo necesita el grupo y su valor único.

1
moys 4 oct. 2019 a las 10:44

Si entiendo correctamente su pregunta, este código simple es para su:

distinct_prod_df = df.drop_duplicates(['product'])

Y da:

   product value
0        1     a
3        2     a
6        3     a
9        4     b
12       5     a
0
Massifox 4 oct. 2019 a las 10:41

Puedes probar esto:

mask = df.groupby('product').apply(lambda x: x.nunique() == 1)
df = df[mask].drop_duplicates()
0
adrianp 4 oct. 2019 a las 10:17
58234218