Tengo un pandas marco de datos y el grupo por dos columnas (por ejemplo col1 y col2). Para valores fijos de col1 y col2 (es decir, para un grupo) puede tener varios valores diferentes en el col3. Me gustaría contar el número de valores distintos de la tercera columnas.

Por ejemplo, Si tengo esta mi entrada:

1  1  1
1  1  1
1  1  2
1  2  3
1  2  3
1  2  3
2  1  1
2  1  2
2  1  3
2  2  3
2  2  3
2  2  3

Me gustaría tener esta tabla (marco de datos) como la salida:

1  1  2
1  2  1
2  1  3
2  2  1
InformationsquelleAutor Roman | 2013-07-29

2 Comentarios

  1. 27
    df.groupby(['col1','col2'])['col3'].nunique().reset_index()
    • curiosamente nunique parece dos veces tan lento como el de Jeff respuesta.
    • Raro! Estoy viendo que también. Groupby puede estar tomando el mal llamado camino de aquí, la lógica que se aplica funciones de los grupos es bastante densa.
    • no hay más gastos con llamadas value_count (que tiene que reconstruir la serie) en cada grupo (en lugar de unique que acabo de volver de un ndarray). Esto puede ser no trivial. Si usted no necesita los índices dentro de la función, a continuación, a menudo se puede evitar esta pena (por no crear instancias de la serie, que value_counts hace, y entonces se descarta porque todo lo que necesita es el len de ella)
    • el uso de nunique() parece ser el óptimo en los pandas 0.18.0
  2. 21
    In [17]: df
    Out[17]: 
        0  1  2
    0   1  1  1
    1   1  1  1
    2   1  1  2
    3   1  2  3
    4   1  2  3
    5   1  2  3
    6   2  1  1
    7   2  1  2
    8   2  1  3
    9   2  2  3
    10  2  2  3
    11  2  2  3
    
    In [19]: df.groupby([0,1])[2].apply(lambda x: len(x.unique()))
    Out[19]: 
    0  1
    1  1    2
       2    1
    2  1    3
       2    1
    dtype: int64

Dejar respuesta

Please enter your comment!
Please enter your name here