pandas数据预处理
数据处理基本流程
数据预处理大致包含以下4个基本流程:
数据整合
数据清洗
数据转化
数据简化
数据集处理
导入数据
df = pd.read_excel(r'F:\python数据集\豆瓣电影数据.xlsx')
df.head()
根据条件删选行
1.找到进球数Goals超过6的球队数据
euro12[euro12.Goals > 6]
2.选取以字母G开头的球队数据
euro12[euro12.Team.str.startswith('G')]
datatime类型处理
将int类型转换为datatime类型
将Year的数据类型转换为 datetime64
crime.Year = pd.to_datetime(crime.Year, format='%Y')
将列Year设置为数据框的索引
crime = crime.set_index('Year', drop = True)
删除名为Total的列
删除前:
crime = crime.set_index('Year', drop = True)
crime.head()
删除后:
数组合并
按照如下的元数据内容创建数据框
raw_data_1 = {
'subject_id': ['1', '2', '3', '4', '5'],
'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}
raw_data_2 = {
'subject_id': ['4', '5', '6', '7', '8'],
'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}
raw_data_3 = {
'subject_id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
'test_id': [51, 15, 15, 61, 16, 14, 15, 1, 61, 16]}
1.将data1和data2两个数据框按照行的维度进行合并,命名为all_data
data1 = pd.DataFrame(raw_data_1, columns = ['subject_id', 'first_name', 'last_name'])
data2 = pd.DataFrame(raw_data_2, columns = ['subject_id', 'first_name', 'last_name'])
data3 = pd.DataFrame(raw_data_3, columns = ['subject_id','test_id'])
all_data = pd.concat([data1, data2])
all_data
2.将data1和data2两个数据框按照列的维度进行合并,命名为all_data_col
all_data_col = pd.concat([data1, data2], axis = 1)
all_data_col
3.按照subject_id的值对all_data和data3作合并
# 运行以下代码
pd.merge(all_data, data3, on='subject_id')
4.对data1和data2按照subject_id作连接
pd.merge(data1, data2, on='subject_id', how='inner')
5.找到 data1 和 data2 合并之后的所有匹配结果
pd.merge(data1, data2, on='subject_id', how='outer')
读取列名称
df.columns
在这里插入图片描述
查询索引
df.index
查看行列数
df.shape
探索数据类型
df.info()
对于数据的分组和分组运算
A
单类分组
A.groupby("性别")
首先,我们有一个变量A,数据类型是DataFrame
想要按照【性别】进行分组
得到的结果是一个Groupby对象,还没有进行任何的运算。
多类分组
A.groupby( ["班级","性别"])
我们还可以一次运用多个函数计算
agg()
分组多个运算
A.groupby( ["班级","性别"]).agg([np.sum, np.mean, np.std]) # 一次计算了三个
例如:
c = chipo[['item_name','quantity']].groupby(['item_name'],as_index=False).agg({'quantity':sum})
c.sort_values(['quantity'],ascending=False,inplace=True)
c.head()
查看缺失值所占比例
缺失值所占总值的比例 isnull().sum(全部的True)/X.shape[0]
df.isnull().mean()
探索标签的分类
查看电影类型分类
Y = df.loc[:,['类型']]
np.unique(Y)
nunique() 返回的是唯一值的个数
df['类型'].nunique()
例如:
重新设置索引
分训练集,测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,Y,test_size=0.3,random_state=420) #随机抽样
Xtrain.head()
重新设置索引
方法一:
for i in [Xtrain, Xtest, Ytrain, Ytest]:
i.index = range(i.shape[0])
# print(i.shape[0])
方法二:
unstack()函数
索引重排
查看样本是否有不平衡问题(统计电影各类型数量)
df[‘类型’] 类型为series类型
df['类型'].value_counts()
方法二
from collections import Counter
print('类型: ', Counter(df['类型']))
取电影类型第一个样本类型
df['类型'].value_counts()[0]
将标签编码
电影各类型进行编码以便后期进行分析
Y_train = df['类型']
from sklearn.preprocessing import LabelEncoder #标签专用
encorder = LabelEncoder().fit(Y_train) #允许一维数据的输入的
#使用训练集进行训练,然后在训练集和测试集上分别进行transform
Ytrain = pd.DataFrame(encorder.transform(Y_train))
Ytrain
设定数值型特征的统计量
第一个percentiles,这个参数可以设定数值型特征的统计量,默认是[.25, .5, .75],也就是返回25%,50%,75%数据量时的数字,但是这个可以修改的,
df[‘Parch’].describe(percentiles=[.2,.75, .8])默认有5
Xtrain.describe([0.01,0.05,0.1,0.25,0.5,0.75,0.9,0.99]).T
排序
对数据框discipline按照先Red Cards再Yellow Cards进行排序
discipline.sort_values(['Red Cards', 'Yellow Cards'], ascending = False)
缺失值处理
缺失值产生原因
pandas使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值,同时python内置None值也会被当作是缺失值。
缺失值产生机制
完全随机缺失(Missing Completely At Random):数据缺失和缺失值及观测值都无关
e.g 医生随机性地忘记记录身高、体重
随机缺失(Missing At Random):数据缺失仅和观测值相关
e.g 老年患者可能会忘记告知医生自己是否患过肺炎,在这种情况下,肺炎这个变量的缺失情况与年龄这个变量相关。
非随机缺失(Missing Not At Random):数据缺失同时和缺失值及观测值相关
e.g 血压正常患者可能会缺失血压测量记录
删除法
删除法”,顾名思义,即直接删除缺失相关的记录, 根据删除的范围可分为:
完全案例删除(Complete Cases Analysis)
有效案例删除(Avaliable Cases Analysis)
pandas中的dropna提供了各种高效快捷的删除方式。
df.dropna() #删除所有带缺失数据的行
完全案例删除
在完全案例删除中,我们将会删除包含任何包含缺失值的记录。
这样做的前提假设是 删除后的子集能够代表样本。
请注意,这种方法仅限于完全随机缺失的情况。
complete_df = iac_df.dropna(how='any')
complete_df.head(10)
可用案例删除
而可用案例删除则会根据具体的分析需求,删除相关变量的缺失记录。
avaliable_df = iac_df.dropna(how='all', subset=['wbc_first'])
avaliable_df.shape
插补法(Imputation)
“插补法”,将缺失值通过某些值进行替代。
中值插补
用该列的中位数替代缺失值
med_impute = df.fillna(value=df.median())
均值插补
用该列的平均值替代缺失值
mean_impute = df.fillna(value=df.mean())
均值插补
用该列的众数替代缺失值
df.fillna(df.mode()[0], inplace=True)