文章目录
- 1. dtype
- 2. data.nunique()
- 3. 列名
- 4. 增删列
建模过程中处理数据的部分是非常重要的,有时候一个命令不清楚会耗费很多时间,理清头绪就会节省很多时间哟
1. dtype
从Hive里面读出来的数据有时候会出现数据类型有误的情况,此时需要进行类型的转换
- 可以对全部数据进行类型转换
- 自动转换数据类型
一是经常会出现整个数据集由csv读进来之后数据都变成了object类型,object类型包括字符串和混合值(数字及非数字)
。object类型比较宽泛,如果可以确定为具体数据类型
,则不建议用object。因此可以对这个进行自动识别转换其他类型
infer_object()
有些许鸡肋了,要把非数值的记录删掉,剩下的记录用这个函数才是int型,但是不干净的数据里面我哪里知道非数值的在哪里,不是也要判断,那跟强制转换有什么区别
所以还是用强制转换成数值型的比较靠谱
- 对每一列进行数据转换
# 全部字段统一数据类型
df = pd.DataFrame(data, dtype='float32')
# 强制转换数据类型
data=data.apply(pd.to_numeric,errors='coerce') #后面的这个参数表示无法转换的采用空值代替
# 转换某一列类型
pd.to_numeric(data[col],errors='coerce').fillna(0) # 兜底填充
2. data.nunique()
查看数据每一列唯一值的个数,对于唯一值个数较少或者较多的可以关注其是否存在异常,个数较少的一般就是对建模没有意义的变量,唯一值较多的可能就是数值型的比如金额、也有可能是类别型的,比如姓名、id、住址等
3. 列名
读入数据之后,通常会碰到需要修改列名的情况
- 变量名带有表名
- 修改某几个变量名
# 带有表名的先分割再取数
data.columns=[x.split('.')[1] for x in data.columns.to_list()]
# 替换变量名
data.rename(columns={'mob6_target':'y'},inplace=True)
4. 增删列
在数据处理过程中,可能会碰到向某个dataframe中添加一列或多列的情况,此时可以有以下方法:
# 数值列
data['intercept']=1
data=sm.add_constant(data)
# 计算列/列表
data['X2']=[x*2 for x in data['X1']]
data['X2']=data['X2'].map(lambda x:
1 if x<4 else(
2 if 4<=x<7 else 3)
# 或者
data.loc[data.index in [1,2,3], '成绩'] = '合格'
data.loc[data.age >=3, '成绩'] = '优秀'
# 插入列
data.insert(2,total,series1/list1) #在第二列的位置插入列名为total的数据列series
注意插入列和assign时都不需要将列名添加引号
!!! 另外还强推isin的用法,比如我想在整个数据集中添加一列,是我对数据集进行拆分(train,test,oot)之后的命名,比如是类别名为train, test, oot
此时我们在train_test_oot()这个自己写的函数得出三个数据集之后,其中的index还是原来的,因此我们可以根据index进行筛选,之前尝试in不对,想不通原理,这里只是另外一个in的函数而已
data.loc[data.index.isin([0,1,7,9,10,11]), 'set_flag'] = 'train'
data.loc[data.index.isin([2,4,8]), 'set_flag'] = 'test'
data.loc[data.index.isin([3,5,6]), 'set_flag'] = 'oot'
后续再补充…