ValueError: agrupador para no unidimensional

7 minutos de lectura

Avatar de usuario de Shahar
Shahar

Tengo el siguiente código que crea una tabla y un diagrama de barras a través de Seaborn.

#Building a dataframe grouped by the # of Engagement Types
sales_type = sales.groupby('# of Engagement Types').sum()

#Calculating the % of people who bought the course by # engagement types
sales_type['% Sales per Participants'] =  round(100*(sales_type['Sales'] / sales_type['Had an Engagement']), 2)

#Calculating the # of people who didn't have any engagements
sales_type.set_value(index=0, col="Had an Engagement", value=sales[sales['Had an Engagement']==0].count()['Sales'])

#Calculating the % of sales for those who didn't have any engagements
sales_type.set_value(index=0, col="% Sales per Participants",
                     value=round(100 * (sales_type.ix[0, 'Sales'] / 
                                        sales[sales['Had an Engagement']==0].count()['Sales']),2))

#Setting the graph image
fig, (ax1) = plt.subplots(nrows=1, ncols=1, figsize=(12,4))
sns.set_style("whitegrid")

# Ploting the histagram for the % of total prospects
ax1 = sns.barplot(x=sales_type.index,y='% Sales per Participants', data=sales_type ,ax=ax1)
ax1.set(ylabel="%")
ax1.set_title('% Sales per Participants By # of Engagement Types') 

#present the table
sales_type.xs(['Had an Engagement', 'Sales','% Sales per Participants'],axis=1).transpose()
#sales_type

Estoy usando el mismo concepto de código para otros parámetros que tengo sin problema. Sin embargo, para un parámetro aparece un error: “ValueError: Grouper for ” not 1-dimensional” para el código de línea:

ax1 = sns.barplot(x=sales_type.index,y='% Sales per Participants', data=sales_type ,ax=ax1)

Este error ocurre aunque el marco de datos no tiene más de una dimensión.

Esta es la cabecera de la mesa:

                       Sales  Pre-Ordered / Ordered Book  \
# of Engagement Types                                      
0                        1.0                         0.0   
1                       20.0                       496.0   
2                       51.0                       434.0   
3                       82.0                       248.0   
4                       71.0                       153.0   
5                       49.0                        97.0   
6                        5.0                        24.0   

                       Opted In For / Clicked to Kindle  Viewed PLC  \
# of Engagement Types                                                 
0                                                   0.0           0   
1                                               27034.0        5920   
2                                                6953.0        6022   
3                                                1990.0        1958   
4                                                 714.0         746   
5                                                 196.0         204   
6                                                  24.0          24   

                       # of PLC Engagement  Viewed Webinar  \
# of Engagement Types                                        
0                                      0.0               0   
1                                   6434.0            1484   
2                                   7469.0            1521   
3                                   2940.0            1450   
4                                   1381.0             724   
5                                    463.0             198   
6                                     54.0              24   

                       # of Webinars (Live/Replay)  \
# of Engagement Types                                
0                                              0.0   
1                                           1613.0   
2                                           1730.0   
3                                           1768.0   
4                                           1018.0   
5                                            355.0   
6                                             45.0   

                       OCCC Facebook Group Member  Engaged in Cart-Open  \
# of Engagement Types                                                     
0                                             0.0                     0   
1                                           148.0                   160   
2                                           498.0                  1206   
3                                           443.0                   967   
4                                           356.0                   511   
5                                           168.0                   177   
6                                            24.0                    24   

                       # of Engagement at Cart Open  Had an Engagement  \
# of Engagement Types                                                    
0                                               0.0               3387   
1                                             189.0              35242   
2                                            1398.0               8317   
3                                            1192.0               2352   
4                                             735.0                801   
5                                             269.0                208   
6                                              40.0                 24   

                       Total # of Engagements  % Sales per Participants  
# of Engagement Types                                                    
0                                         0.0                      0.03  
1                                     35914.0                      0.06  
2                                     18482.0                      0.61  
3                                      8581.0                      3.49  
4                                      4357.0                      8.86  
5                                      1548.0                     23.56  
6                                       211.0                     20.83  

Este es el error completo:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-211-f0185fe64c1a> in <module>()
     12 sns.set_style("whitegrid")
     13 # Ploting the histagram for the % of total prospects
---> 14 ax1 = sns.barplot(x=sales_type.index,y='% Sales per Participants', data=sales_type ,ax=ax1)
     15 ax1.set(ylabel="%")
     16 ax1.set_title('% Sales per Participants By # of Engagement Types')

ValueError: Grouper for '<class 'pandas.core.frame.DataFrame'>' not 1-dimensional

Intenté buscar este error en Internet y Stack Overflow, pero no obtuve resultados. ¿Alguien tiene una idea de lo que está pasando?

  • Pegue el encabezado de los datos de entrada.

    –Scott Boston

    08/04/2017 a las 20:33

  • He agregado el encabezado de los datos de entrada. Perdón por el formato, esa es la mejor manera que pude encontrar (no tengo suficientes puntos para agregar una imagen).

    – Shahar

    10 de abril de 2017 a las 13:57

  • Para otros, mi problema era que tenía dos columnas con el mismo nombre que estaba tratando de group by en.

    – Rubén Flam-Pastor

    24 de agosto de 2020 a las 21:08

avatar de usuario de firelynx
lince de fuego

Problema simplificado

También me encontré con este problema y descubrí que era causado por nombres de columna duplicados.

Para recrear esto:

df = pd.DataFrame({"foo": [1,2,3], "bar": [1,2,3]})
df.rename(columns={'foo': 'bar'}, inplace=True)

   bar  bar
0    1    1
1    2    2
2    3    3

df.groupby('bar')

ValueError: Grouper for 'bar' not 1-dimensional

Al igual que muchos errores de pandas crípticos, este también se debe a que tiene dos columnas con el mismo nombre.

Averigüe cuál desea usar, cambie el nombre o elimine la otra columna y vuelva a realizar la operación.

Solución

Renombra las columnas así

df.columns = ['foo', 'bar']

   foo  bar
0    1    1
1    2    2
2    3    3

df.groupby('bar')
<pandas.core.groupby.DataFrameGroupBy object at 0x1066dd950>

  • Uno podría pensar que un mensaje de error es “el marco de datos contiene más de una columna llamada {grouper}”, que en realidad indica cuál es el problema.

    – Veneno lindo

    26 de julio de 2022 a las 12:43

avatar de usuario de eliu
elio

TL;RD:

Ejemplo rápido: si voy a agrupar a un grupo de personas por carrerasuna persona es un ing o un tecnologíano pueden ser ambos, de lo contrario groupby() no sabré si poner a esa persona en el tecnología grupo o el ing grupo.
Su código, desafortunadamente, asignó a algunas personas a ambos ing Y tecnología al mismo tiempo.

En primer lugar, solo para asegurarnos de que VERDADERAMENTE entender lo que groupby() lo hace.

Usaremos este ejemplo. Fruta df se muestra aquí:

import pandas as pd
import numpy as np
df = pd.DataFrame(
    {"fruit": ['apple', 'apple', 'orange', 'orange'], "color": ['r', 'g', 'b', 'r']},
    index=[11, 22, 33, 44],
)

"""
[df] df:
+----+---------+---------+
|    | fruit   | color   |
|----+---------+---------|
| 11 | apple   | r       |
| 22 | apple   | g       |
| 33 | orange  | b       |
| 44 | orange  | r       |
+----+---------+---------+
"""

Observa una muy válida df.groupby() a continuación, desviándose de un uso típico:

gp = df.groupby(
    {
        0: 'mine',
        1: 'mine',
        11: 'mine',
        22: 'mine',
        33: 'mine',
        44: 'you are rats with wings!',
    }
)
"""
[df] [group] mine:
+----+---------+---------+
|    | fruit   | color   |
|----+---------+---------|
| 11 | apple   | r       |
| 22 | apple   | g       |
| 33 | orange  | b       |
+----+---------+---------+

[df] [group] you are rats with wings!:
+----+---------+---------+
|    | fruit   | color   |
|----+---------+---------|
| 44 | orange  | r       |
+----+---------+---------+
"""

Espera, el groupby() ¡¿Ni siquiera usó ‘fruta’ o ‘color’ en absoluto?!
¡Así es! groupby() no necesita preocuparse por df o ‘fruta’ o ‘color’ o Nemo, groupby() solo se preocupa por una cosa, una tabla de búsqueda que le dice qué índice pertenece a qué grupo.

En este caso, por ejemplo, el diccionario pasó al groupby() está instruyendo al groupby() a:
si ves el índice 11entonces es un "mine"coloque la fila con ese índice en el grupo llamado "mine".
si ves el índice 22entonces es un "mine"coloque la fila con ese índice en el grupo llamado "mine".

incluso 0 y 1 no están en df.index no es un problema

Convencional df.groupby('fruit') o df.groupby(df['fruit']) sigue exactamente la regla anterior. La columna df['fruit'] se usa como una tabla de búsqueda, dice groupby() ese índice 11 es un "apple"

Ahora, con respecto a: agrupador para ‘‘ no unidimensional

lo que está diciendo es realmente: for some or all indexes in df, you are assigning MORE THAN just one label

Examinemos algunos posibles errores usando el ejemplo anterior:
[x] df.groupby(df) no funcionará, le diste groupby() un mapeo 2D, cada índice recibió 2 nombres de grupo. Se quejará: is index 11 an "apple" or an "r"? make up your mind!

[x] los siguientes códigos tampoco funcionarán. Aunque el mapeo ahora es 1D, es un índice de mapeo 11 a "mine" así como también "yours". pandas’ df y sr permita un índice no único, así que tenga cuidado.

mapping = pd.DataFrame(index= [ 11,     11,      22,     33,     44    ], 
                       data = ['mine', 'yours', 'mine', 'mine', 'yours'], )
df.groupby(mapping)

# different error message, but same idea
mapping = pd.Series(   index= [ 11,     11,      22,     33,     44    ], 
                       data = ['mine', 'yours', 'mine', 'mine', 'yours'], )
df.groupby(mapping)

avatar de usuario de wm
wm

Me pasó cuando accidentalmente creé columnas MultiIndex:

>>> values = np.asarray([[1, 1], [2, 2], [3, 3]])

# notice accidental double brackets around column list
>>> df = pd.DataFrame(values, columns=[["foo", "bar"]])

# prints very innocently
>>> df
  foo bar
0   1   1
1   2   2
2   3   3

# but throws this error
>>> df.groupby("foo")
ValueError: Grouper for 'foo' not 1-dimensional

# cause:
>>> df.columns
MultiIndex(levels=[['bar', 'foo']],
           labels=[[1, 0]])

# fix by using correct columns list
>>> df = pd.DataFrame(values, columns=["foo", "bar"])
>>> df.groupby("foo")
<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x7f9a280cbb70>

  • pero ¿qué sucede si desea utilizar índices múltiples? Tiene sentido para mis datos, estoy tratando de agrupar las columnas (eje = 1) pero me encuentro con muchos problemas como este.

    – Vegetal

    24 de enero de 2020 a las 17:42

  • Si necesita un índice múltiple, me temo que esta respuesta no será de ayuda para usted

    – wm

    25 de enero de 2020 a las 18:19


avatar de usuario de moto
moto

Algo que agregar a la respuesta de @wm.

Si está agregando varias columnas de un marco de datos a otro:

df1[['col1', 'col2']] = df2[['col1', 'col2']]

creará un índice de varias columnas y si intenta agrupar por cualquier cosa en df1te dará este error.

Para resolver esto, deshazte del índice múltiple usando

df1.columns = df1.columns.get_level_values(0)

Me pasó cuando estaba usando df en lugar de pd como:

df.pivot_table(df[["....

instead of

pd.pivot_table(df[["...

  • I had a same mistake 🙂

    – Park

    Oct 6, 2021 at 2:11

EntzY's user avatar
EntzY

Fix the problem by correcting the column name first, probably the column name isn’t a 1 dimensional list when you input.
you can do:

column_name = ["foo", "bar"]

df = pd.DataFrame(valores, columnas=nombre_columna) # luego agrupar de nuevo df.groupby("barra")

  • Tuve el mismo error 🙂

    – Parque

    6 de octubre de 2021 a las 2:11

¿Ha sido útil esta solución?