Pandas进阶玖 类别与区间
pandas进阶系列根据datawhale远昊大佬的joyful pandas教程写一些自己的心得和补充,本文部分引用了原教程,并参考了pandas官网
另注:本文是对joyful pandas教程的延伸,完整理解需先阅读joyful pandas教程第九章
【练一练】
无论是interval_range
还是下一章时间序列中的date_range
都是给定了等差序列中四要素中的三个,从而确定整个序列。请回顾等差数列中的首项、末项、项数和公差的联系,写出interval_range
中四个参数之间的恒等关系。
我的答案
start + periods * freq = end
练习
Ex1:统计未出现的类别
在第五章中介绍了crosstab
函数,在默认参数下它能够对两个列的组合出现的频数进行统计汇总:
请实现一个带有dropna
参数的my_crosstab
函数来完成上面的功能。
import numpy as np
import pandas as pd
df = pd.DataFrame({
'A':['a','b','c','a'], 'B':['cat','cat','dog','cat']})
df.B = df.B.astype('category').cat.add_categories('sheep')
df.A = df.A.astype('category').cat.add_categories('d')
我的思路
我利用了之前学过的pivot_table方法,先求出下表
tmp = pd.concat([df.A, df.B], axis=1)
tmp['value'] = 0
tmp
A | B | value | |
---|---|---|---|
0 | a | cat | 0 |
1 | b | cat | 0 |
2 | c | dog | 0 |
3 | a | cat | 0 |
然后利用pivot_table变形,将A的值作为索引,B的值作为列名,value经过统计后作为表中的数值,如果dropna=False
就使用concat再补充几列或几行进去,算法如下
def my_crosstab(s1, s2, dropna=True):
tmp = pd.concat([s1, s2], axis=1)
tmp['value'] = 0
res = tmp.pivot_table(index=s1.name,
columns=s2.name,
values='value',
aggfunc='count')
if not dropna:
b_cats = set(s2.cat.categories