Pandas数据载入与预处理
一、数据载入
1 读取excel,文本文件,csv
import numpy as np
#读取excel,默认读取第一个sheet
p = pd.read_excel('data//tips.xls')
#如果想读取student的sheet
p = pd.read_excel('data//tips.xls','student')
# print(p.head())
#读取txt文件
a = pd.read_table('data//a.txt')
# print(a.head())
#读取CSV文件
d = pd.read_csv('data//dots.csv')
print(d.head(3))
2、读取json,数据库
二、数据合并
1、merge数据合并
x = pd.DataFrame({'name':['A','B','C','D'],'age':[1,2,3,4]})
print(x)
y = pd.DataFrame({'name':['A','B','E'],'age':[1,5,6]})
print(y)
#默认合并的取的是两个数据的交集
print(pd.merge(x,y))
输出结果:
1.1 内连接-inner
#按name,将 x,y有相同name的进行合并
print('outer:\n',pd.merge(x,y,how='inner',on='name'))
输出结果:
1.2 外连接--outer
#外连:x,y的所有name罗列出来
print('outer:\n',pd.merge(x,y,how='outer',on='name'))
输出结果:
1.3 左连接-left
#外连:x,y的所有name罗列出来
print('outer:\n',pd.merge(x,y,how='outer',on='name'))
输出结果:
1.4 右连接-right
print('right:\n',pd.merge(x,y,how='right',on='name'))
输出结果:
1.5 参数suffiexes作用:重复列名的修改
print(pd.merge(x,y,on='name',suffixes=('_left','_right')))
输出结果:
2、concat数据连接
默认情况下,会按行堆叠数据。
s1 = pd.Series([0,1],index=['a','b'])
s2 = pd.Series([2,3,4],index=['a','b','c'])
s3 = pd.Series([5,6],index=['f','g'])
print(pd.concat([s1,s2,s3]))
输出结果:
2.2 两个DataFrame的数据合并
data1 = pd.DataFrame(np.arange(6).reshape(2,3),columns=list('abc'))
print(data1)
data2 = pd.DataFrame(np.arange(20,26).reshape(2,3),columns=list('ayz'))
print(data2)
data = pd.concat([data1,data2],axis=0)
print(data)
输出结果:
2.3
s1 = pd.Series([0,1],index=['a','b'])
print(s1)
s2 = pd.Series([2,3,4],index=['a','d','e'])
#print(s2)
s3 = pd.Series([5,6],index=['f','g'])
#print(s3)
s4 = pd.concat([s1*5,s3],sort=False)
print(s4)
s5 = pd.concat([s1,s4],axis=1,sort=False)
print(s5)
输出结果:
axis=1,按列进行合并,axis=0 表示的按行进行合并
s6 = pd.concat([s1,s4],axis=1,join='inner',sort=False)
print(s6)
输出结果:
三、数据清洗
1、缺失值检测和统计
1.1检测缺失值-isnull()
string_data = pd.Series(['lu','li','zhang',np.nan,'wang'])
print(string_data)
#打印是否为空值
print(string_data.isnull())
#缺失值的个数
print('缺失值的个数为:\n',string_data.isnull().sum())
输出结果:
1.2 isnull.sum() 统计缺失值
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A','B','C','D'])
#iloc 按索引进行选择(索引为2行以后的行,都为NAN)
df.iloc[2,:] = np.nan
print(df)
# 统计每一列的空值的和
print(df.isnull().sum())
1.3、使用info可以查看缺失值
print(df.info()) #查看缺失值的情况,每一列,有几个不是缺失值
输出结果:
2、缺失值的处理
删除缺失值 -dropna()
在缺失值的处理方法中,删除缺失值是常用的方法之一。通过dropna方法可以删除具有缺失值的行。
dropna方法的格式:
dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
2.1 缺失值在Series的应用
from numpy import nan as NA
data = pd.Series([23,7,NA,3.5,NA])
print(data)
# print(data.dropna())
not_null = data.notnull()#判断是否不为空
print(not_null)
2.2 缺失值在DataFrame中的应用:
dropna()默认会删除任何含有缺失值的行
data = pd.DataFrame([[1,2,3,4],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
print('删除缺失值后:\n',data.dropna())
2.3 dropna 参数how-any(只要含有任何一个 ) all(全部为缺失值时删除)
data = pd.DataFrame([[1,2,3,4],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
print('删除全部为缺失值的行:\n',data.dropna(how='all'))
2.4 dropna参数axis=0( 按行) axis=1 (按列) 默认按行
data = pd.DataFrame([[1,2,3,NA],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
print('按列删除全部为缺失值后:\n',data.dropna(how='all',axis=1))
输出结果:
2.5 dropna中的thresh参数 表示一行至少有N个非NaN才参存活
data = pd.DataFrame([[1,2,NA],[5,NA,NA],[NA,NA,NA],[NA,6,7]])
print(data)
#表示一行中有两个不是缺失值可以存活
f = data.dropna(thresh=2)
#按列来看,有超过10%的缺失值的列删除
#f = data.dropna(thresh=len(data)*0.9,axis=1)
print(f)
输出结果:
3.填充缺失值--fillna
3.1 给定值填弃缺失值:df.fillna({1:0.88,2:0.99}
df = pd.DataFrame(np.random.randn(5,3))
print(df)
#索引行0-3,索引列1 设为 NaN
df.loc[:3,1]=NA
#索引行0-2,索引列2 设为 NaN
df.loc[:2,2]=NA
#将索引列1的NaN填充为0.88,索引列2的NaN填充为0.99,inplace=True表示改变原数据
df.fillna({1:0.88,2:0.99},inplace=True)
print(df)
输出结果:
3.2 fillna中的method中的应用
注method='ffill' 向下填充
df = pd.DataFrame(np.random.randn(6,3))
#索引为2行到最后,索引为1的列
df.iloc[2:,1] = NA
#索引为4行到最后,索引为2的列
df.iloc[4:,2] = NA
print(df)
df.fillna(method='ffill',inplace=True)
print(df)
输出结果:
3.3 用Series的均值-mean()填充
data = pd.Series([1.,NA,3.5,NA,7])
print(data)
#使用均值填充
print(data.fillna(data.mean()))
输出结果:
4、检测与处理重复值
4.1 检测重复值---duplicates()
在DataFrame中利用duplicates方法判断每一行是否与之前的行重复。duplicates方法返回一个布尔值
data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
#判断是否和之前的行重复
print(data.duplicated())
输出结果:
4.2 删除重复的行--- drop_duplicates()
data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
//删除重复记录,默认保留第一个
b = data.drop_duplicates()
print(b)
指定列名看是否重复
data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
#指定部分列重复去重,只看k2,k3列,有重复的删除
b = data.drop_duplicates(['k2','k3'])
print(b)
默认保留的数 据为第一个出现的记录,通过keep='last' 可以保留最后一个出现的记录
data = pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
#保留最晚出现的重复值
b = data.drop_duplicates(['k2','k3'],keep='last')
print(b)
5、数据转换
5.1 替换
replace(要替换的值, 替换为的值)
data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','','石家庄']}
df = pd.DataFrame(data)
f=df.replace('','不详')
print(f)
传入列表实现多个值同时替换,第一个参数是要替换的值,第二个参数是替换为的值
data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','','石家庄']}
df = pd.DataFrame(data)
f=df.replace('','不详')
print(f)
#将'不详'替换为'石家庄',将'上海'替换为'广州'
fs = f.replace(['不详','上海'],['石家庄','广州'])
print(fs)
传入字典实现多值替换
data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','','石家庄']}
df = pd.DataFrame(data)
f=df.replace('','不详')
print(f)
fs = f.replace({'1':'男','0':'女'})
print(fs)
使用map方法映射数据
data = {'姓名':['小红','小明','小丽','小张'],'性别':['0','1','0','1'],'籍贯':['北京','上海','武汉','石家庄']}
df = pd.DataFrame(data)
df['成绩']=[89,68,50,92]
print(df)
def grade(x):
if x>=90:
return '优'
elif 70<=x<90:
return '良'
elif 60<=x<70:
return '中'
else:
return '差'
df['等级']=df['成绩'].map(grade)
print(df)
6、数据的标准化
6.1 离差标准化数据
def MinMaxScale(data):
data = (data-data.min())/(data.max()-data.min())
return data
x = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
print('原始数据为:\n',x)
x_sc=MinMaxScale(x)
print('标准化后矩阵为:\n',x_sc)
6.2 标准差标准化数据
def StandardScale(data):
data = (data-data.mean())/data.std()
return data
x = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
print('原始数据为:\n',x)
x_sc = StandardScale(x)
print('标准化后矩阵为:\n',x_sc)
输出结果:
6.3 数据转化
类别型数据的哑变量处理
df = pd.DataFrame([
['green', 'M', 10.1, 'class1'],
['red', 'L', 13.5, 'class2'],
['blue', 'XL', 15.3, 'class1']])
df.columns = ['color', 'size', 'prize','class label']
print(df)
#哑变量处理
print(pd.get_dummies(df))
输出结果:
6.4 连续型变量的离散化
等宽法:cut
df = pd.DataFrame([
['green', 'M', 10.1, 'class1'],
['red', 'L', 13.5, 'class2'],
['blue', 'XL', 15.3, 'class1']])
df.columns = ['color', 'size', 'prize','class label']
print(df)
#哑变量处理
print(pd.get_dummies(df))
本章实训
使用文件: tips_mod.xls
1、导入模块
import pandas as pd import numpy as np
2、获取模块
data = pd.read_excel('data//tips_mod.xls')
print(data.head())
3、分析数据
data = pd.read_excel('data//tips_mod.xls')
print(data.shape)
print(data.describe())
4、显示聚餐时间段
print(data['聚餐时间段'].unique())
5、修改拼写错误的字段值
data.loc[data['聚餐时间段']=='Dier','聚餐时间段']='Dinner'
data.loc[data['聚餐时间段']=='Diner','聚餐时间段']='Dinner'
print(data['聚餐时间段'].unique())
6、检测数据中的缺失值
print(data.isnull().sum())
输出结果:
7、删除一行内有两个缺失值的数据
data.dropna(thresh=6,inplace=True)#因为一共是8列,有6列不缺失, 表示有两列缺失
print(data.isnull().sum())
8、删除性别或时间段为空行
data.dropna(subset=['性别','聚餐时间段'],inplace=True)
print(data.isnull().sum())
9、对剩余的空缺的数据用平均值替换
data.fillna(data.mean(),inplace=True)
print(data.isnull().sum())