目录
一、删除属性/特征选择
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']]
二、缺失值处理
缺失值处理通常有三种方法:
- 样本就缺失个别数据,删除样本
- 某个属性值缺失太多,就删除该属性,
- 用某些值填充
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)]