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?
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
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 11
entonces es un "mine"
coloque la fila con ese índice en el grupo llamado "mine"
.
si ves el índice 22
entonces 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)
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
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 df1
te 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 🙂
– ParkOct 6, 2021 at 2:11
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
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