在Titanic数据集上使用groupby和unstack之后,无法绘制一系列计数图

时间:2016-10-20 16:11:35

标签: pandas matplotlib seaborn

所以我的原始数据框Cabin_hunt看起来像这样:

      Fare     Cabin    Pclass Ticket  
583  40.1250   A10       1     13049   
208  27.7208   A11       1     17613   
475  52.0000   A14       1     110465   
556  39.6000   A16       1     11755   
331  29.7000   A18       1     17580   
284  26.0000   A19       1     113056   
599  56.9292   A20       1     17485   
737  512.3292  B101      1     17755   
815   0.0000   B102      1    112058   
215  42.5000   B11       1    113038   
329  57.9792   B18       1    111361   
523  57.9792   B18       1    111361   
269  135.6333  C99       1    17760   
97   63.3583   D10       1    17759   
350  63.3583   D10       3    17759   
765  77.9583   D11       3    13502  

然后我根据他们'Cabin'值的第一个字母继续划分'Cabin'。我最终的目标是以图形方式显示Pclass和每个Cabin组之间的关系。我通过以下代码创建了组:

Cabin_group =Cabin_hunt.groupby([ Cabin_hunt.Pclass,Cabin_hunt.Cabin.str[0]]).size().unstack()

我的输出如下:

Cabin      A     B     C     D     E     F    G    T
Pclass                                              
1       22.0  65.0  94.0  40.0  34.0   NaN  NaN  1.0
2        NaN   NaN   NaN   6.0   4.0  13.0  NaN  NaN
3        NaN   NaN   NaN   NaN   3.0   8.0  5.0  NaN

Cabin_group.columns和index输出以下代码:

  
    
      

Cabin_group.columns

    
  
Index([u'A', u'B', u'C', u'D', u'E', u'F', u'G', u'T'], dtype='object',    name=u'Cabin')
  
    
      

Cabin_group.index

    
  
 Int64Index([1, 2, 3], dtype='int64', name=u'Pclass')

理想情况下,我需要8个图表一个屏幕;每个字母一个(A-T)。 在每个图表中,我想显示三个条形,每个条形代表x轴上的Pclass和y轴上的观察量。

我和Countplot以及PairGrid一起玩,但我无法正常工作。

g = sns.PairGrid(Cabin_group)
g.map(sns.countplot)
plt.show()

我也试过这样的事情:

g = sns.FacetGrid(Cabin_group, col=Cabin_group.columns, size=4, aspect=.5)
g.map(sns.countplot,x=Cabin_group.index)

回想起来似乎完全错了。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

至于我从你想要获得的图形描述中理解的内容,这就是我在IPython Notebook中所做的:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Generate Data
data = np.array(
    [[ 22.,  65.,  94.,  40.,  34.,  np.nan,  np.nan,   1.],
    [ np.nan,  np.nan,  np.nan,   6.,   4.,  13.,  np.nan,  np.nan],
    [ np.nan,  np.nan,  np.nan,  np.nan,   3.,   8.,   5.,  np.nan]]
)
df = pd.DataFrame(data)
df.columns.name = 'Cabin'
df.columns = 'A     B     C     D     E     F    G    T'.split()
df.index.name = 'Pclass'
df.index = [1, 2, 3]

# Plot Data
for no, col in enumerate(df):
    plt.subplot(2, 4, no+1)
    df[col].plot(kind='bar', title=col)
    plt.xlabel('Pclass')
    plt.ylabel('Amount of observations')
    plt.ylim([0, df.max().max()])
plt.tight_layout()
plt.show()

这是结果:

enter image description here