pandas学习-Task09

Datewhale学习内容: https://datawhalechina.github.io/joyful-pandas/build/html/%E7%9B%AE%E5%BD%95/ch9.html

练一练:

请回顾等差数列中的首项、末项、项数、公差的联系,写出interval_range中四个参数之间的恒等关系。interval_range中的start, end, periods, freq参数分别对应区间序列的起点、终点、区间个数和区间长度。

【我的解答】:

end = start + freq * (periods-1)

练习题1: 统计未出现的类别

在第五章中介绍了 crosstab 函数,在默认参数下它能够对两个列的组合出现的频数进行统计汇总。但事实上有些列存储的是分类变量,列中并不一定包含所有的类别,此时如果想要对这些未出现的类别在 crosstab 结果中也进行汇总,则可以指定 dropna 参数为 False。
请实现一个带有 dropna 参数的 my_crosstab 函数来完成上面的功能。

【我的思考】:
其实就是需要将序列中出现的类别统计出来,以及原有的所有类别统计出来,然后对这两种情况进行处理。

【参考答案】:

def my_crosstab(s1, s2, dropna=True):
    idx1 = (s1.cat.categories if s1.dtype.name == 'category' and not dropna else s1.unique())
    idx2 = (s2.cat.categories if s2.dtype.name == 'category' and not dropna else s2.unique())
    res = pd.DataFrame(np.zeros((idx1.shape[0], idx2.shape[0])),
                      index=idx1, columns=idx2)
    for i, j in zip(s1,s2):
        res.at[i,j] += 1
    res = res.rename_axis(index=s1.name, columns=s2.name).astype('int')
    return res
df = pd.DataFrame({'A':['a','b','c','a'],
                  'B':['cat', 'cat','dog','cat']})
df.B = df.B.astype('category').cat.add_categories('sheep')
my_crosstab(df.A, df.B, dropna=False)

在这里插入图片描述

练习题2: 钻石数据集

df = pd.read_csv('joyful-pandas-master/data/diamonds.csv')

数据查看:

在这里插入图片描述

1、分别对 df.cut 在 object 类型和 category 类型下使用 nunique 函数,并比较它们的性能。

【我的解答】:

%timeit -n 30 df.cut.astype('category').nunique()
输出:2.71 ms ± 297 µs per loop (mean ± std. dev. of 7 runs, 30 loops each)

%timeit -n 30 df.cut.nunique()
输出:1.83 ms ± 267 µs per loop (mean ± std. dev. of 7 runs, 30 loops each)

2、钻石的切割质量可以分为五个等级,由次到好分别是 Fair, Good, Very Good, Premium, Ideal ,纯净度有八个等级,由次到好分别是 I1, SI2, SI1, VS2, VS1, VVS2, VVS1, IF ,请对切割质量按照 由好到次 的顺序排序,相同切割质量的钻石,按照纯净度进行 由次到好 的排序。

【我的解答】:

df.cut.astype('category')
df.sort_values(['cut','clarity'],ascending=[False,True])

在这里插入图片描述
注意:修改列的类型为category后,需要赋予相应的大小关系。
【参考答案】:

df.cut = df.cut.astype('category').cat.reorder_categories([
       'Fair', 'Good', 'Very Good', 'Premium', 'Ideal'],ordered=True)
df.clarity = df.clarity.astype('category').cat.reorder_categories([
       'I1', 'SI2', 'SI1', 'VS2', 'VS1', 'VVS2', 'VVS1', 'IF'],ordered=True)
res = df.sort_values(['cut', 'clarity'], ascending=[False, True])
res

在这里插入图片描述

3、分别采用两种不同的方法,把 cut, clarity 这两列按照 由好到次 的顺序,映射到从0到n-1的整数,其中n表示类别的个数。

【复习】利用了cat对象,每一个序列的类别会被赋予唯一的整数编号,他们的编号取决于cat.categories中的顺序,该属性可以通过codes访问。

df.cut = df.cut.cat.reorder_categories(df.cut.cat.categories[::-1])
df.clarity = df.clarity.cat.reorder_categories(df.clarity.cat.categories[::-1])
df.clarity = df.clarity.cat.reorder_categories(df.clarity.cat.categories[::-1])

在这里插入图片描述

4、对每克拉的价格按照分别按照分位数(q=[0.2, 0.4, 0.6, 0.8])与[1000, 3500, 5500, 18000]割点进行分箱得到五个类别 Very Low, Low, Mid, High, Very High ,并把按这两种分箱方法得到的 category 序列依次添加到原表中。

【我的解答】:
这是考察了区间类别的用法。cut与qcut,前者是按照传入的整数n来等间距分段,后者是根据等分位数来分段。

avg = df.price / df.carat
q = [0, 0.2, 0.4, 0.6, 0.8, 1]
df['avg_qcut'] = pd.qcut(avg, q=q, labels=['Very Low', 'Low', 'Mid', 'High', 'Very High'])

point = [-np.infty, 1000, 3500, 5500, 18000, np.infty]
df['avg_cut'] = pd.cut(avg, bins=point, labels=['Very Low', 'Low', 'Mid', 'High', 'Very High'])
df

在这里插入图片描述

5、第4问中按照整数分箱得到的序列中,是否出现了所有的类别?如果存在没有出现的类别请把该类别删除。

【我的思考】:
现需要求出出现了的类别,再查看总的类别,对比后再将没有出现的类别删除。

df.avg_cut.unique()
df.avg_cut = df.avg_cut.cat.remove_categories(['Very Low', 'Very High'])
df.avg_cut

在这里插入图片描述

6、对第4问中按照分位数分箱得到的序列,求每个样本对应所在区间的左右端点值和长度。
【我的思考】:
这里考察了区间的属性与方法。一个区间具备三个要素:左端点、右端点和端点的开闭状态,其中开闭状态可以指定right, left, both, neither中的一类。如果想用cut或者qcut的结果进行分析的话,IntervalIndex有若干常用属性:left, right, mid, length,分别表示左右端点、两端点均值和区间长度。

interval_avg = pd.IntervalIndex(pd.qcut(avg, q=q))
interval_avg.right.to_series().reset_index(drop=True)
interval_avg.left.to_series().reset_index(drop=True)
interval_avg.length.to_series().reset_index(drop=True)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值