1. crosstab
crosstab
是一个地位尴尬的函数,因为它能实现的所有功能 pivot_table
都能完成。在默认状态下, crosstab
可以统计元素组合出现的频数,即 count
操作。例如统计 learn_pandas
数据集中学校和转系情况对应的频数:
In [56]: df = pd.read_csv('data/learn_pandas.csv')
In [57]: pd.crosstab(index = df.School, columns = df.Transfer)
Out[57]:
Transfer N Y
School
Fudan University 38 1
Peking University 28 2
Shanghai Jiao Tong University 53 0
Tsinghua University 62 4
这等价于如下 crosstab
的如下写法,这里的 aggfunc
即聚合参数:
In [58]: pd.crosstab(index = df.School, columns = df.Transfer,
....: values = [0]*df.shape[0], aggfunc = 'count')
....:
Out[58]:
Transfer N Y
School
Fudan University 38.0 1.0
Peking University 28.0 2.0
Shanghai Jiao Tong University 53.0 NaN
Tsinghua University 62.0 4.0
同样,可以利用 pivot_table
进行等价操作,由于这里统计的是组合的频数,因此 values
参数无论传入哪一个列都不会影响最后的结果:
In [59]: df.pivot_table(index = 'School',
....: columns = 'Transfer',
....: values = 'Name',
....: aggfunc = 'count')
....:
Out[59]:
Transfer N Y
School
Fudan University 38.0 1.0
Peking University 28.0 2.0
Shanghai Jiao Tong University 53.0 NaN
Tsinghua University 62.0 4.0
从上面可以看出这两个函数的区别在于, crosstab
的对应位置传入的是具体的序列,而 pivot_table
传入的是被调用表对应的名字,若传入序列对应的值则会报错。
除了默认状态下的 count
统计,所有的聚合字符串和返回标量的自定义函数都是可用的,例如统计对应组合的身高均值:
In [60]: pd.crosstab(index = df.School, columns = df.Transfer,
....: values = df.Height, aggfunc = 'mean')
....:
Out[60]:
Transfer N Y
School
Fudan University 162.043750 177.20
Peking University 163.429630 162.40
Shanghai Jiao Tong University 163.953846 NaN
Tsinghua University 163.253571 164.55
2. explode
explode
参数能够对某一列的元素进行纵向的展开,被展开的单元格必须存储 list, tuple, Series, np.ndarray
中的一种类型。
In [61]: df_ex = pd.DataFrame({'A': [[1, 2],
....: 'my_str',
....: {1, 2},
....: pd.Series([3, 4])],
....: 'B': 1})
....:
In [62]: df_ex.explode('A')
Out[62]:
A B
0 1 1
0 2 1
1 my_str 1
2 1 1
2 2 1
3 3 1
3 4 1
3. get_dummies
get_dummies
是用于特征构建的重要函数之一,其作用是把类别特征转为指示变量。例如,对年级一列转为指示变量,属于某一个年级的对应列标记为1,否则为0:
In [63]: pd.get_dummies(df.Grade).head()
Out[63]:
Freshman Junior Senior Sophomore
0 1 0 0 0
1 1 0 0 0
2 0 0 1 0
3 0 0 0 1
4 0 0 0 1