3. Pandas数据预处理

本文详细介绍了使用Pandas进行数据预处理的各种方法,包括删除属性、处理缺失值、选择和删除样本、数据变换和修改、字符型数据处理、数据合并、测试集训练集分割、数据规范化以及平衡不平衡数据等步骤,涵盖了数据处理的各个环节。
摘要由CSDN通过智能技术生成

目录

一、删除属性/特征选择

1.1 删除某几列无用的属性、特征

#比如删除ID,ID通常是没用的
data.drop(['ID'],inplace=True,axis=1)

1.2 选择,保留某些特定属性

features = ['feature1','feature2','feature3','feature4'...]
data = data[features]  #往里传入的是列表!!
#注意pandas的Dataframe[]里接受的是列表!!,直接输入属性名的时候别忘了两个[[]]

1.3 更改特征,属性列的顺序

order = ['feature3','feature1','feature2'] #原本顺序是 feature1,feature2,feature3
data = data[order]

1.4 删除只有一个值的属性

值没有变化,对机器学习无意义
Drop those features which contain only one unique value

original_column = data.columns
drop_column = []
for col in original_column:
    feature_values = data[col].dropna().unique() # 1.dropna删除缺失值Nan;2.unique看data[col]这个Series中有几种值:返回的是list
    if len(feature_values) ==1:
        drop_column.append(col)
data = data.drop(drop_column, axis=1)
print(drop_column) #打印被删除的列是哪些

1.5 将属性features和标签labels从数据集中分开

X = data.drop(['label_name'],axis=1)
Y = data[['label_name']]

二、缺失值处理

缺失值处理通常有三种方法:

  1. 样本就缺失个别数据,删除样本
  2. 某个属性值缺失太多,就删除该属性,
  3. 用某些值填充

2.1 只要有缺失值null就删除该行样本

data.dropna(inplace=True)  

注意此方法,删除了缺失值所在的行,但是索引值(index)没有重新排序

2.1.1 某几个属性下,如果出现缺失值就删除样本行

data.dropna(subset=['feature'],inplace=True)  

2.2 样本中有x个以上的缺失值才删除该行样本

data.dropna(axis=0,thresh=8,inplace=True) #样本中至少8个值是非缺失的才保留(总共10个属性)

2.3 样本种所有数据都缺失才删除该行样本

data.dropna(inplace=True, how = 'all')

2.4 使用属性列的均值来填充缺失值

data['Attribute_name'].fillna(data['Attribute_name'].mean(),inplace=True)

2.5 使用特定值来填充缺失值

fill_value = xxxxx
data['Attribute_name'].fillna(fill_value,inplace=True)

2.6 使用缺失值的前一个/后一个值代替NaN

data.fillna(method='pad') #用前一个值替代NaN
data.fillna(method='bfill') #用后一个值替代NaN

2.7 传入字典,对不同的列(属性)填充不同的值

data.fillna({
   "Attribute_name1":fill_value1,"Attribute_name2":fill_value2...})
#一般不大用,多使用几次fillna填充缺失值,比一次性用字典填充好一些

2.8 用groupby定位特定的样本群,求统计量后填充缺失值

数据中Age缺失的有点多,思想是:将那些与缺失Age样本具有同样Sex和Pclass的群体样本的Age中位数来填充,比如说有个样本缺失Age,它的Sex=female,Pclass=1;那么groupby找到对应的一群样本,求这群样本的Age中位数然后填充缺失值

data['Age'] = data.groupby(['Sex', 'Pclass'])['Age'].apply(lambda x: x.fillna(x.median()))

2.9 拉格朗日插值法

xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx

2.10 找到属性值缺失x%的才删除

null_cols = [col for col in data.columns if data[col].isnull().sum() / data.shape[0] > 0.9] # 一个属性中NaN缺失值的个数/样本总数=缺失比率>0.9

三、样本/数据选择

可借鉴这个博客

3.1 根据某个特定的属性值来选择样本

推荐使用query

request_data = data.query("feature1 <= num_value1 & feature2== 'str_value2'")
chosen_samples = data[data[attirbute_name] == specific_value]

比较运算法==,<,>,!=…

chosen_samples = data.loc[data['feature_name']=='particular_value']
chosen_samples = data[data.attirbute_name.between(start,end)]

选择某个属性为空的样本(可能用来填充)

null_data = data[data[attirbute_name].isnull()]

逻辑运算

data = data[(condition1)&(condition2)]    and / or / not 

3.1.1 根据属性A==某值,来找到该样本下属性B的值

举例:找到姓名为刘星的样本,他的数学成绩为多少
在这里插入图片描述

df.query("姓名=='刘星'")['数学'].values[0]

3.2 获取包含特定字符str的样本(模糊搜索)

data = data[data[attirbute_name].str.contains("special_words",na=False)]

可能包含多个字符串,或搜索。

data = data[data['comment'].str.contains('China|china|beijing|Beijing|Chinese|chinese|ccp|CCP') ]

3.3 使用索引index选取数据

data1 = data.iloc[x,y]  #选取第x+1行,第y+1列
data2 = data.iloc[[x1,x2],:] # 选取第x1+1和第x2+1行,所有列
data3 = data.iloc[x1:x2,:]  #选取第x1+1行 到 x2+1行的所有数据,所有列
series4 = data.iloc[:,y]  #选取数据的第y+1列的值,返回的是Series
series5 = data.iloc[x,:]  #选取数据的第x+1行的值,返回的是Series

3.4 使用label索引选取数据

使用loc时,数据的索引必定是人为指定的label索引,而不是默认的0开始的数字索引

df = data.loc[label_value_x:label_value_y, ] 获取 x行到y行之间的所有样本
df = data.loc[:,attribute_name] #选取attribute_name该列的所有数据

3.5 通过属性1的特定值来找属性2的统计量

df.loc[df['sex'] == 'male', 'Age'].mean()

3.6 随机抽取样本

samples = DataFrame.sample(n,frac,replace,random_state,axis)

n:要抽取的样本数量
frac:抽取的比例
replace:是否有放回,True为放回抽样,默认False
axis 【0,1】控制抽取行(0),还是列(1)

random_factor = numpy.random.randint(start,end,num)  
#start,end是要抽取得范围的索引;num是要抽取的个数
samples = data.loc[random_factor,:]    #也可以直接写成data.loc[random_factor]

3.7 从一个数据集中剔除掉筛选出的数据集(数据集分成验证机、训练集)

train_df =train_data.sample(frac=0.8)
val_df = train_data[~train_data.index.isin(train_df .index)]

3.8 用apply lambda进行复杂筛选

还可以通过和 apply 方法结合,构造更加复杂的过滤,实现将某个返回值为 boolean 的方法作为过滤条件:

def 判断函数:
	return True/False
df[df.apply(lambda x: x['b'] > x['c'], axis=1)]

3.9 给定一个ID子列表,筛选总体样本中ID在该子列表中的样本


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值