我有以下代码,通过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
我对其他参数使用相同的代码概念,没有任何问题。但是,对于一个参数,我得到一个错误:" ValueError:Grouper for''不是一维的#34;对于行代码:
ax1 = sns.barplot(x=sales_type.index,y='% Sales per Participants', data=sales_type ,ax=ax1)
虽然数据框不具有多个维度,但会发生此错误。
这是表格的负责人:
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
这是完整的错误:
---------------------------------------------------------------------------
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
我已经尝试搜索互联网和Stack Overflow这个错误,但没有结果。有没有人知道发生了什么?
答案 0 :(得分:40)
我也遇到了这个问题,找到了它的原因和明显的解决方案
重新创建:
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
就像很多神秘的熊猫错误一样,这个错误也源于两个同名的列。
找出你要使用的那个,重命名或删除另一列并重做操作。
重命名这样的列
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>
答案 1 :(得分:4)
当我意外地创建了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>
答案 2 :(得分:2)
要添加到@ w-m答案中的内容。
如果您要将一个数据帧的多个列添加到另一个数据帧:
df1[['col1', 'col2']] = df2[['col1', 'col2']]
它将创建一个多列索引,如果您尝试按df1
上的任何内容进行分组,则会出现此错误。
要解决此问题,请通过使用
摆脱多索引df1.columns = df1.columns.get_level_values(0)
答案 3 :(得分:2)
当我使用df而不是pd时发生了我的事情:
df.pivot_table(df[["....
代替
pd.pivot_table(df[["...
答案 4 :(得分:1)
TL; DR:的意思是真的:对于df中的某些或所有索引,您分配的不仅仅是一个标签,groupby()
不知道它是哪个标签应该用于分组。
groupby()
的作用。我们将使用示例df
进行遍历:
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 |
+----+---------+---------+
"""
这里是有效的df.groupby()
:
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 |
+----+---------+---------+
"""
groupby()
不需要关心df
或'水果'或'颜色'或Nemo,groupby()
只关心一件事,一个查询表可以告诉它{ {1}}映射到哪个标签(即组名)。
例如,在这种情况下,传递给df.index
的字典将指示groupby()
进行以下操作:
如果看到索引groupby()
,则它是一个11
,将具有该索引的行放在名为"mine"
的组中。
如果看到索引"mine"
,则它是一个22
,将包含该索引的行放在名为"mine"
的组中。
...
即使0和1不在"mine"
中也不是问题
常规df.index
或df.groupby('fruit')
严格遵循上述规则。 df.groupby(df['fruit'])
是查找表,它告诉df['fruit']
索引groupby()
是11
实际上是在说"apple"
[1] for some or all indexes in df, you are assigning MORE THAN just one label
在此示例中不起作用,df.groupby(df)
将抱怨:groupby()
[2]以下内容也将不起作用,尽管is index 11 an "apple" or an "r"? make up your mind!
是一维的,但它正在将mapping
映射到index 11
以及mine
。 yours
和df
允许非唯一索引,所以要小心。
sr
答案 5 :(得分:0)
首先通过更正列名来解决问题,可能是您输入时列名不是一维列表。 你可以这样做:
column_name = ["foo", "bar"]
df = pd.DataFrame(values, columns=column_name)
# then groupby again
df.groupby("bar")