四、练习

Ex1:统计未出现的类别

第五章 变形 中介绍了 crosstab 函数,在默认参数下它能够对两个列的组合出现的频数进行统计汇总:

In [71]: df = pd.DataFrame({'A':['a','b','c','a'],
   ....:                    'B':['cat','cat','dog','cat']})
   ....: 
In [72]: pd.crosstab(df.A, df.B)
Out[72]: 
B  cat  dog
A  
a    2    0
b    1    0
c    0    1

但事实上有些列存储的是分类变量,列中并不一定包含所有的类别,此时如果想要对这些未出现的类别在 crosstab 结果中也进行汇总,则可以指定 dropna 参数为 False

In [73]: df.B = df.B.astype('category').cat.add_categories('sheep')
In [74]: pd.crosstab(df.A, df.B, dropna=False)
Out[74]: 
B  cat  dog  sheep
A         
a    2    0      0
b    1    0      0
c    0    1      0

请实现一个带有 dropna 参数的 my_crosstab 函数来完成上面的功能。

Ex2:钻石数据集

现有一份关于钻石的数据集,其中 carat, cut, clarity, price 分别表示克拉重量、切割质量、纯净度和价格,样例如下:

In [75]: df = pd.read_csv('data/diamonds.csv')
In [76]: df.head(3)
Out[76]: 
   carat      cut clarity  price
0   0.23    Ideal     SI2    326
1   0.21  Premium     SI1    326
2   0.23     Good     VS1    327
  1. 分别对 df.cutobject 类型和 category 类型下使用 nunique 函数,并比较它们的性能。
  2. 钻石的切割质量可以分为五个等级,由次到好分别是 Fair, Good, Very Good, Premium, Ideal ,纯净度有八个等级,由次到好分别是 I1, SI2, SI1, VS2, VS1, VVS2, VVS1, IF ,请对切割质量按照 由好到次 的顺序排序,相同切割质量的钻石,按照纯净度进行 由次到好 的排序。
  3. 分别采用两种不同的方法,把 cut, clarity 这两列按照 由好到次 的顺序,映射到从0到n-1的整数,其中n表示类别的个数。
  4. 对每克拉的价格分别按照分位数(q=[0.2, 0.4, 0.6, 0.8])与[1000, 3500, 5500, 18000]割点进行分箱得到五个类别 Very Low, Low, Mid, High, Very High ,并把按这两种分箱方法得到的 category 序列依次添加到原表中。
  5. 第4问中按照整数分箱得到的序列中,是否出现了所有的类别?如果存在没有出现的类别请把该类别删除。
  6. 对第4问中按照分位数分箱得到的序列,求每个样本对应所在区间的左右端点值和长度。