pandas ValueError:不是一维的分组器< something>

plupiseo  于 2023-01-15  发布在  其他
关注(0)|答案(6)|浏览(214)

我有下面的代码,通过海运创建一个表格和柱状图。

#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

我对其他参数使用了相同的代码概念,没有问题。但是,有一个参数出现了错误:“值错误:“”的分组器不是一维的”行代码:

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

尽管 Dataframe 没有多个维度,但仍会发生此错误。
这是表格的标题:

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

我试着在互联网和堆栈溢出中搜索这个错误,但是没有结果。有人知道发生了什么吗?

2g32fytz

2g32fytz1#

简化问题

我也遇到过这个问题,发现是由重复的列名引起的。
要重新创建此对话框:

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

就像许多隐含的panda错误一样,这个错误也是因为两列同名。
确定要使用哪一列,重命名或删除另一列,然后重做操作。

溶液

按如下方式重命名列

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>
ni65a41a

ni65a41a2#

    • TL; DR:**

简单示例:如果要按"职业"对一群人进行分组,那么一个人要么是"工程师",要么是"技术人员",不能两者兼而有之,否则groupby()就不知道该把这个人归到"技术人员"组还是"工程师"组。
你的代码,不幸的是分配给一些人同时进入 * 工程 * 和 * 技术 *。

首先,只是为了确保我们 * 真正 * 了解groupby()的功能。

我们将使用下面显示的 * fruit * 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()甚至根本没有使用"水果"或"颜色"?!
没错! groupby()不需要关心df或"fruit"或"color"或Nemo,groupby()只关心一件事,一个查找表,它告诉它哪个索引属于哪个组
在这种情况下,例如,传递到groupby()的字典指示groupby()
如果您看到索引11,那么它就是"mine",请将具有该索引行放入名为"mine"的组中。
如果您看到索引22,则它是"mine",将具有该索引行放入名为"mine"的组中。
...
即使0和1不在df.index中也不是问题
常规的df.groupby('fruit')df.groupby(df['fruit'])完全遵循上述规则,列df['fruit']用作查找表,它告诉groupby()索引11"apple"

现在,关于:"Pandas.核心.框架.数据框架"〉"的分组器不是一维的

它实际上是在说:for some or all indexes in df, you are assigning MORE THAN just one label

    • 让我们使用上面的示例检查一些可能的错误:**

[x]df.groupby(df)将无法工作,您为groupby()提供了一个2DMap,每个索引被指定了2个组名。is index 11 an "apple" or an "r"? make up your mind!
[x]下面的代码也不起作用。虽然现在的Map是1D的,但它将索引11Map到"mine"以及"yours"。Pandas的dfsr允许非唯一索引,所以要小心。

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)
vh0rcniy

vh0rcniy3#

当我不小心创建了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>
ibrsph3r

ibrsph3r4#

在@w-m的回答中添加一些内容。
如果要将多个列从一个 Dataframe 添加到另一个 Dataframe :

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

它将创建一个多列索引,如果您试图按df1上任何内容进行分组,它将给予此错误。
要解决此问题,请使用以下方法消除多索引

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

hyrbngr75#

当我使用df而不是pd时,发生了以下情况:

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

代替

pd.pivot_table(df[["...
pqwbnv8z

pqwbnv8z6#

首先更正列名来解决此问题,输入时列名可能不是一维列表。您可以执行以下操作:

column_name = ["foo", "bar"]

df = pd.DataFrame(values, columns=column_name)

# then groupby again
df.groupby("bar")

相关问题