三、其他变形函数

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