Tengo un DataFrame de elementos con dos ID diferentes. id1 e id2, donde id2 es verdaderamente único y puede haber varios id2 en uno id1. Las características del artículo son específicas de los id2.

df = pd.DataFrame([[111, 12345, "A", "red", "big"],
                  [111, 12399, "A", "red", "small"],
                  [222, 345, "B", "red", "small"],
                  [222, 349, "B", "blue", "small"]],
                  columns=["id1", "id2", "feature1", "feature2", "feature3"]

    id1     id2     feature1    feature2    feature3
0   111     12345   A           red         big
1   111     12399   A           red         small
2   222     345     B           red         small
3   222     349     B           blue        small

Quiero agrupar por id1 y obtener valores compatibles en las columnas, solo cuando todas las filas de un grupo tienen el mismo valor en esa columna, de lo contrario, un NaN. Entonces, el resultado esperado en el ejemplo anterior es:

     id2    feature1    feature2    feature3
id1
111  NaN    A           red         NaN
222  NaN    B           NaN         small

Escribí esta función que quiero aplicar al objeto agrupado, pero no funciona de esta manera:

def consistent(series):
    if series.nunique() == 1:
        return series.iloc[0]
    else:
        return np.nan

df1.groupby("id1").apply(consistent)

¿Qué estoy haciendo mal?

0
Bubastis 25 ago. 2020 a las 16:43

2 respuestas

La mejor respuesta

Use a continuación:

df.groupby("id1").apply(lambda x: x.apply(consistent))
0
Bubastis 25 ago. 2020 a las 19:28

Puedes probarlo con:

import numpy as np
df.groupby("id1").agg(lambda x: np.nan if len(set(x)) != 1 else list(set(x))[0])

La salida de este código es:

id1 id2 feature1    feature2    feature3

111 NaN A   red NaN
222 NaN B   NaN small

Espero que esto ayude

1
ELOUASSIF Abdellah 25 ago. 2020 a las 14:13