[Pandas Day4]变形变形
1.上面提到了许多变形函数,如melt/crosstab/pivot/pivot_table/stack/unstack函数,请总结它们各自的使用特点。
pivot函数是透视表,不过局限性比较大,除了功能上较少之外,还不允许values中出现重复的行列索引对
pivot_table是pivot函数的引申,允许出现行索引的重复,默认为求均值mean,与pivot相比,运行速度较慢
unstack函数是stack函数的逆操作,即解压,性质与stack函数类似
stack函数是最基本的变形函数,顾名思义就是压缩,总共只有两个参数:level和dropna,stack函数可以看做将横向的索引放
到纵向,因此功能类似与melt,参数level可指定变化的列索引是哪一层(或哪几层,需要列表),比如stack(0)相当于压缩最
外层的行,若没给定数值stack()相当于压缩最内层的行
melt函数相当于pivot_table的逆操作,将unstacked状态的数据,压缩成stacked,使“宽”的DataFrame变“窄”,即相当于多列
数据压缩在一列里面
crosstab是交叉表,交叉表是一种特殊的透视表,典型的用途如分组统计,若参数不给定默认为统计个数count
变形函数和多级索引是什么关系?哪些变形函数会使得索引维数变化?具体如何变化?
近似对DataFrame分组;melt会使索引维度增加
3.请举出一个除了上文提过的关于哑变量方法的例子
什么情况下需要设置哑变量
对于无序多分类变量,引入模型时需要转化为哑变量
举一个例子,如血型,一般分为A、B、O、AB四个类型,为无序多分类变量,通常情况下在录入数据的时候,为了使数据量
化,我们常会将其赋值为1、2、3、4。
从数字的角度来看,赋值为1、2、3、4后,它们是具有从小到大一定的顺序关系的,而实际上,四种血型之间并没有这种大
小关系存在,它们之间应该是相互平等独立的关系。如果按照1、2、3、4赋值并带入到回归模型中是不合理的,此时我们就
需要将其转化为哑变量。
对于有序多分类变量,引入模型时需要酌情考虑
例如疾病的严重程度,一般分为轻、中、重度,可认为是有序多分类变量,通常情况下我们也常会将其赋值为1、2、3(等
距)或1、2、4(等比)等形式,通过由小到大的数字关系,来体现疾病严重程度之间一定的等级关系。
但需要注意的是,一旦赋值为上述等距或等比的数值形式,这在某种程度上是认为疾病的严重程度也呈现类似的等距或等比的
关系。而事实上由于疾病在临床上的复杂性,不同的严重程度之间并非是严格的等距或等比关系,因此再赋值为上述形式就显
得不太合理,此时可以将其转化为哑变量进行量化。
对于连续性变量,进行变量转化时可以考虑设定为哑变量
对于连续性变量,很多人认为可以直接将其带入到回归模型中即可,但有时我们还需要结合实际的临床意义,对连续性变量作
适当的转换。例如年龄,以连续性变量带入模型时,其解释为年龄每增加一岁时对于因变量的影响。但往往年龄增加一岁,其
效应是很微弱的,并没有太大的实际意义。
此时,我们可以将年龄这个连续性变量进行离散化,按照10岁一个年龄段进行划分,如0-10、11-20、21-30、31-40等等,将
每一组赋值为1、2、3、4,此时构建模型的回归系数就可以解释为年龄每增加10岁时对因变量的影响。
情况,例如在年龄段较低和较高的人群中,某种疾病的死亡率较高,而在中青年人群中,死亡率却相对较低,年龄和死亡结局
之间呈现一个U字型的关系,此时再将年龄段赋值为1、2、3、4就显得不太合理了。
因此,当我们无法确定自变量和因变量之间的变化关系,将连续性自变量离散化时,可以考虑进行哑变量转换。
还有一种情况,例如将BMI按照临床诊断标准分为体重过低、正常体重、超重、肥胖等几种分类时,由于不同分类之间划分的
切点是不等距的,此时赋值为1、2、3就不太符合实际情况,也可以考虑将其转化为哑变量。
4.使用完stack后立即使用unstack一定能保证变化结果与原始表完全一致吗?
不完全一致
5.既然melt起到了stack的功能,为什么再设计stack函数?
https://blog.csdn.net/Guo_ya_nan/article/details/80686903
ex 4-1
import numpy as np
import pandas as pd
df = pd.read_csv('joyful-pandas-master/data/Drugs.csv')
# print(df.head())
# 将数据表转化成:每行需要显示每种药物在每个地区的10年至17年的变化情况,且前三列需要排序
result = pd.pivot_table(df,index=['State','COUNTY','SubstanceName'] ,columns='YYYY'
,values='DrugReports',fill_value='-').reset_index().rename_axis(columns={'YYYY':''})
print(result.head())
# 将(a)中的结果恢复到原数据表,并通过equal函数检验初始表与新的结果是否一致(返回True)
result_melted = result.melt(id_vars=result.columns[:3],value_vars=result.columns[-8:]
,var_name='YYYY',value_name='DrugReports').query('DrugReports != "-"')
result2 = result_melted.sort_values(by=['State','COUNTY','YYYY'
,'SubstanceName']).reset_index().drop(columns='index')
评论0
最新资源