Con Pandas groupby, puedo hacer cosas como esta:
>>> df = pd.DataFrame( ... { ... "A": ["foo", "bar", "bar", "foo", "bar"], ... "B": ["one", "two", "three", "four", "five"], ... } ... ) >>> print(df) AB 0 foo one 1 bar two 2 bar three 3 foo four 4 bar five >>> print(df.groupby('A')['B'].unique()) A bar [two, three, five] foo [one, four] Name: B, dtype: objectLo que estoy buscando es una salida que produzca una lista de índices en lugar de una lista de la columna B:
A bar [1, 2, 4] foo [0, 3]Sin embargo, groupby('A').index.unique() no funciona. ¿Qué sintaxis me proporcionaría el resultado que busco? Estaría más que feliz de hacer esto de otra manera que no sea groupby, aunque necesito agrupar por dos columnas en mi aplicación real.
Utilice df.reset_index con Groupby.Series.unique
In [530]: df.reset_index().groupby('A')['index'].unique() Out[530]: A bar [1, 2, 4] foo [0, 3] Name: index, dtype: objectO:
In [533]: df.reset_index().groupby('A')['index'].agg(list) Out[533]: A bar [1, 2, 4] foo [0, 3] Name: index, dtype: objectNo necesariamente necesita tener una etiqueta en groupby , puede usar un objeto de agrupación.
Esto permite cosas como:
df.index.to_series().groupby(df['A']).unique()producción:
A bar [1, 2, 4] foo [0, 3] dtype: object df[~df[['A', 'B']].duplicated()].index.to_series().groupby(df['A']).unique()Una forma intuitiva es agregar una línea para definir una nueva columna como índice, y puede seguir usando el mismo código que escribió.
df['index'] = df.index df.groupby('A')['index'].unique()Resultado:
Si desea índices de valores únicos en 'B', en lugar de índices únicos, puede hacerlo
df.reset_index().groupby('A').apply(lambda g: g.drop_duplicates(['B'])['index'].tolist())es diferente de las respuestas de @Mayank y @mozway cuando se aplica a un df de ejemplo ligeramente modificado:
df = pd.DataFrame( { "A": ["foo", "bar", "bar", "foo", "bar", "foo"], "B": ["one", "two", "three", "four", "five", "one"], } )mi respuesta volvería
A bar [1, 2, 4] foo [0, 3] dtype: objectmientras que @Mayank y @mozway regresarían
A bar [1, 2, 4] foo [0, 3, 5] Name: index, dtype: object