在binning i之后,无法访问dataframe的groupby对象的各个列

2024-09-29 19:25:05 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题与this one相似,但有一个关键的区别——当数据帧被分组到bin中时,链接问题的解决方案并不能解决这个问题。在

以下代码将生成一个错误,该代码将对两个变量的存储单元的相对分布进行装箱绘制:

import pandas as pd
import seaborn as sns

raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 
        'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 
        'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
        'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3],
        'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]}
df = pd.DataFrame(raw_data, columns = ['regiment', 'company', 'name', 'preTestScore', 'postTestScore'])


df1 = df.groupby(['regiment'])['preTestScore'].value_counts().unstack()
df1.fillna(0, inplace=True)


sns.boxplot(x='regiment', y='preTestScore', data=df1)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-241-fc8036eb7d0b> in <module>()
----> 1 sns.boxplot(x='regiment', y='preTestScore', data=df1)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\seaborn\categorical.py in boxplot(x, y, hue, data, order, hue_order, orient, color, palette, saturation, width, dodge, fliersize, linewidth, whis, notch, ax, **kwargs)
   2209     plotter = _BoxPlotter(x, y, hue, data, order, hue_order,
   2210                           orient, color, palette, saturation,
-> 2211                           width, dodge, fliersize, linewidth)
   2212 
   2213     if ax is None:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\seaborn\categorical.py in __init__(self, x, y, hue, data, order, hue_order, orient, color, palette, saturation, width, dodge, fliersize, linewidth)
    439                  width, dodge, fliersize, linewidth):
    440 
--> 441         self.establish_variables(x, y, hue, data, orient, order, hue_order)
    442         self.establish_colors(color, palette, saturation)
    443 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\seaborn\categorical.py in establish_variables(self, x, y, hue, data, orient, order, hue_order, units)
    149                 if isinstance(input, string_types):
    150                     err = "Could not interpret input '{}'".format(input)
--> 151                     raise ValueError(err)
    152 
    153             # Figure out the plotting orientation

ValueError: Could not interpret input 'regiment'

如果我删除xy参数,它将生成一个boxplot,但它不是我想要的:

enter image description here

我怎么解决这个问题?我尝试了以下方法:

^{pr2}$

enter image description here

它现在看起来像一个数据帧,所以我想提取这个数据帧的列名并按顺序为每个列绘制:

cols = df1.columns[1:len(df1.columns)]
for i in range(len(cols)):
    sns.boxplot(x='regiment', y=cols[i], data=df1)

enter image description here

这看起来不对。事实上,这不是一个普通的数据帧;如果我们打印出它的列,它不会将regiment显示为列,这就是为什么boxplot给出错误ValueError: Could not interpret input 'regiment'

df1.columns
>>> Index(['regiment', 2, 3, 4, 24, 31], dtype='object', name='preTestScore')

所以,如果我能以某种方式使regiment成为数据帧的一列,我想我应该能够绘制preTestScorevsregiment的框线图。我错了吗?在


编辑:我想要的是这样的:

df1 = df.groupby(['regiment'])['preTestScore'].value_counts().unstack()
df1.fillna(0, inplace=True)

# This df2 dataframe is the one I'm trying to construct using groupby
data = {'regiment':['Dragoons', 'Nighthawks', 'Scouts'], 'preTestScore 2':[0.0, 1.0, 2.0], 'preTestScore 3':[1.0, 0.0, 2.0],
        'preTestScore 4':[1.0, 1.0, 0.0], 'preTestScore 24':[1.0, 1.0, 0.0], 'preTestScore 31':[1.0, 1.0, 0.0]}

cols = ['regiment', 'preTestScore 2', 'preTestScore 3', 'preTestScore 4', 'preTestScore 24', 'preTestScore 31']

df2 = pd.DataFrame(data, columns=cols)
df2

enter image description here

fig = plt.figure(figsize=(20,3))

count = 1
for col in cols[1:]:
    plt.subplot(1, len(cols)-1, count)
    sns.boxplot(x='regiment', y=col, data=df2)
    count+=1

enter image description here


Tags: 数据ininputdataorderhuedf1cols
1条回答
网友
1楼 · 发布于 2024-09-29 19:25:05

如果您对您的数据帧df1执行reset_index()操作,则应该会得到您想要的数据帧。

问题是您有一个所需的列(regiment)作为索引,因此需要重置它并使其成为另一列。在

编辑:为结果数据帧中的正确列名添加add_prefix

示例代码:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 
        'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 
        'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
        'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3],
        'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]}
df = pd.DataFrame(raw_data, columns = ['regiment', 'company', 'name', 'preTestScore', 'postTestScore'])


df1 = df.groupby(['regiment'])['preTestScore'].value_counts().unstack()
df1.fillna(0, inplace=True)

df1 = df1.add_prefix('preTestScore ')  # <- add_prefix for proper column names

df2 = df1.reset_index()  # <- Here is reset_index()
cols = df2.columns

fig = plt.figure(figsize=(20,3))

count = 1
for col in cols[1:]:
    plt.subplot(1, len(cols)-1, count)
    sns.boxplot(x='regiment', y=col, data=df2)
    count+=1

输出:
enter image description here

相关问题 更多 >

    热门问题