注:小蚊子团队KEN主讲,共分6章。第一章,python与数据分析概况;第二章,python安装和使用;第三章,数据准备; 第四章 数据处理;第五章 数据分析;第六章,数据可视化
4.1、数据导入
1)、通过文件导入
CSV
语法:read_csv(file,encoding)
from pandas import read_csv df = read_csv( 'D://dataloop//python_work//DataAnalysis//4.1//1.csv' ) dfEXCEL
语法:read_excel(fileName,sheetname,names)
from pandas import read_excel;
df = read_excel(
'D://dataloop//python_work//DataAnalysis//4.1//3.xlsx',
sheetname='data'
)
TXT语法:read_table(file,names=[列名1,列名2,...],sep="",encoding,...)
from pandas import read_table
df = read_table(
'D://dataloop//python_work//DataAnalysis//4.1//2.txt',
names=['age', 'name'],
sep=','
)
df
中文问题encoding='UTF-8',
engine='python'
df = read_table( filePath, sep=',', encoding='UTF-8', engine='python' )2)、通过数据库导入
MySQL
Access
SQL Server
等等
4.2数据导出
导出文本文件
csv
to_csv函数语法:to_csv(filePath,sep=",",index=True,header=Ture)
默认sep=",",index=True,header=Ture
from pandas import DataFrame; df = DataFrame({ 'age': [21, 22, 23], 'name': ['KEN', 'John', 'JIMI'] }) df.to_csv( "D://dataloop//python_work//DataAnalysis//4.2//df.csv" ) df.to_csv( "D://dataloop//python_work//DataAnalysis//4.2//df.csv", index=False )4.3重复值处理
把数据结构中,行相同的数据只保留一行
函数语法:drop_duplicates()
from pandas import read_csv df = read_csv('D://dataloop//python_work//DataAnalysis//4.3//data.csv') df #找出行重复的位置 dIndex = df.duplicated() #根据某些列,找出重复的位置 dIndex = df.duplicated('id') dIndex = df.duplicated(['id', 'key']) #根据返回值,把重复数据提取出来 df[dIndex] #直接删除重复值 #默认根据所有的列,进行删除 newDF = df.drop_duplicates() #当然也可以指定某一列,进行重复值处理 newDF = df.drop_duplicates('id')4.4缺失值处理
1)、缺失值得产生:
有些信息暂时无法获取
有些信息被遗漏或者错误处理了
2)、缺失值处理方式:
a、数据补齐
如平均值填充
b、删除对应缺失行
避免缺失值对整体数据的影响
数据量较少时谨慎使用
c、不处理
有时候缺失数据是正常的,如单身人士的配偶
3)、缺失值处理函数:
去除数据结构中值为空的数据
函数语法:dropna()
from pandas import read_csv df = read_csv( 'D://dataloop//python_work//DataAnalysis//4.4//data.csv' ) df = read_csv( 'D://dataloop//python_work//DataAnalysis//4.4//data2.csv', na_values=['a','b'] ) #找出空值的位置 isNA = df.isnull() #获取出空值所在的行 df[isNA.any(axis=1)] df[isNA[['key']].any(axis=1)] df[isNA[['key', 'value']].any(axis=1)] df.fillna('未知') #直接删除空值 newDF = df.dropna()4.5空格值处理
清除字符型数据左右的空格
语法:strip()
from pandas import read_csv df = read_csv( 'D://dataloop//python_work//DataAnalysis\\4.5\\data.csv' ) newName = df['name'].str.lstrip() newName = df['name'].str.rstrip() newName = df['name'].str.strip() df['name'] = newName4.6字段抽取
是根据已知列数据的开始和结束位置,抽取出新的列
函数:slice(start,stop)
from pandas import read_csv df = read_csv( 'D://dataloop//python_work//DataAnalysis\\4.6\\data.csv' ) df['tel'] = df['tel'].astype(str) #运营商 bands = df['tel'].str.slice(0, 3) #地区 areas = df['tel'].str.slice(3, 7) #号码段 nums = df['tel'].str.slice(7, 11) #赋值回去 df['bands'] = bands df['areas'] = areas df['nums'] = nums4.7字段拆分
是指按照固定的字段,拆分已有的字符集
分割函数:split(sep,n,expand=False)
sep--用于分割的字符串,n--分割为几列(1为2列,2为3列,...),expand--是否展开为数据框,默认为False
返回值:
如果expand为True,则返回为DataFrame;
如果expand为False,则返回为Series。
from pandas import read_csv df = read_csv( 'D://dataloop//python_work//DataAnalysis//4.7//data.csv' ) newDF = df['name'].str.split(' ', 1, True) newDF.columns = ['band', 'name']4.8记录抽取
是指根据一定的条件,对数据进行抽取
记录抽取函数:dataframe[condition]
condition--过滤的条件
返回值:DataFrame
过滤条件
比较运算:>,<,>=
子主题 2
范围运算:between(left,right)
空值匹配:pandas.isnull(column)
字符匹配:str.contains(patten,na=False)
逻辑运算:与&,或|,取反not
import pandas df = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\4.8\\data.csv', sep="|" ) #单条件,返回符合条件的数据框 df[df.comments>10000] #多条件 df[df.comments.between(1000, 10000)] #过滤空值所在行 df[pandas.isnull(df.title)] #根据关键字过滤 df[df.title.str.contains('台电', na=False)] #~为取反 df[~df.title.str.contains('台电', na=False)] #组合逻辑条件 df[(df.comments>=1000) & (df.comments<=10000)]4.9随机抽样
是指随机从数据中按照一定的行数或者比例抽取数据
函数:DataFrame.sample(n,frac,replace=False)
n--按个数抽样,frac--按百分比抽样,replace--是否可放回抽样,默认False不可放回
返回值:抽样后的数据框
seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任 何参数都不会被传递,kwargs是一个包含关键字参数的字典。
分层抽样法,也叫类型抽样法。就是将总体单位按其属性特征分成若干类型或层,然后在类型或层中随机抽取样本单位。
# -*- coding: utf-8 -*- import numpy import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\4.9\\data.csv' ) #设置随机种子 numpy.random.seed(seed=2) #按照个数抽样 data.sample(n=10) #按照百分比抽样 data.sample(frac=0.02) #是否可放回抽样, #replace=True,可放回, #replace=False,不可放回 data.sample(n=10, replace=True) #典型抽样,分层抽样 gbr = data.groupby("class") gbr.groups typicalNDict = { 1: 2, 2: 4, 3: 6 } def typicalSampling(group, typicalNDict): name = group.name n = typicalNDict[name] return group.sample(n=n) result = data.groupby( 'class', group_keys=False ).apply(typicalSampling, typicalNDict) typicalFracDict = { 1: 0.2, 2: 0.4, 3: 0.6 } def typicalSampling(group, typicalFracDict): name = group.name frac = typicalFracDict[name] return group.sample(frac=frac) result = data.groupby( 'class', group_keys=False ).apply(typicalSampling, typicalFracDict)4.10记录合并
是指将两个结构相同的数据框合并成一个数据框
函数:concat([dataFrame1,dataFrame2,...])
返回值:dataFrame
import pandas from pandas import read_csv data1 = read_csv( 'D://dataloop//python_work//DataAnalysis\\4.10\\data1.csv', sep="|" ) data2 = read_csv( 'D://dataloop//python_work//DataAnalysis\\4.10\\data2.csv', sep="|" ) data3 = read_csv( 'D://dataloop//python_work//DataAnalysis\\4.10\\data3.csv', sep="|" ) data = pandas.concat([data1, data2, data3]) data = pandas.concat([ data1[[0, 1]], data2[[1, 2]], data3[[0, 2]] ])4.11字段合并
是指将将同一个数据框中的不同列进行合并,形成新的列
方法:x=x1+x2+x3+...
注意:x1位数据列1,必须为字符型
返回值:Series
from pandas import read_csv df = read_csv( 'D://dataloop//python_work//DataAnalysis\\4.11\\data.csv', sep=" ", names=['band', 'area', 'num'] ) df = df.astype(str) tel = df['band'] + df['area'] + df['num'] df['tel'] = tel4.12字段匹配
根据各表共有的关键字段,把各表所需的记录一一对应起来
函数:merge(x,y,left_on,right_on)
x--第一个数据框,y--第二个数据框
left_on:第一个数据框用于匹配的列
right_on:第二个数据框用于匹配的列
注:left_on和right_on类型要相同
返回值:DataFrame
import pandas items = pandas.read_csv( 'D:\\PDA\\4.12\\data1.csv', sep='|', names=['id', 'comments', 'title'] ) prices = pandas.read_csv( 'D:\\PDA\\4.12\\data2.csv', sep='|', names=['id', 'oldPrice', 'nowPrice'] ) #默认只是保留连接上的部分 itemPrices = pandas.merge( items, prices, left_on='id', right_on='id' ) #即使连接不上,也保留左边没连上的部分 itemPrices = pandas.merge( items, prices, left_on='id', right_on='id', how='left' ) #即使连接不上,也保留右边没连上的部分 itemPrices = pandas.merge( items, prices, left_on='id', right_on='id', how='right' ) #即使连接不上,也保留所有没连上的部分 itemPrices = pandas.merge( items, prices, left_on='id', right_on='id', how='outer' )4.13简单计算
是指通过对已有字段进行加减乘除等运算,得出新的字段
data['total'] = data.price*data.num
import pandas data = pandas.read_csv( 'D:\\PDA\\4.13\\data.csv', sep="|" ) data['total'] = data.price*data.num #注意,用点的方式,虽然可以访问,但是并没有组合进数据框中 data = pandas.read_csv( 'D:\\PDA\\4.13\\data.csv', sep="|" ) data.total = data.price*data.num4.14数据标准化
是指将数据按比例缩放,使之落入到特定区间
消除不同数据间量当的影响
主要用于
综合评价分析
聚类分析
因子分析
主成分分析
0-1标准化公式:X*=(x-min)/(max-min)
import pandas data = pandas.read_csv( 'D:\\PDA\\4.14\\data.csv' ) data['scale'] = round( ( data.score-data.score.min() )/( data.score.max()-data.score.min() ) , 2 )4.15数组分组
是根据数据分析对象的特征,按照一定的数值指标,把数据分析对象划分为不同的区间进行研究,以揭示其内在的联系和规律性
函数:cut(series,bins,right=True,labels=NULL)
series--需要分组的数据,bins--分组的划分数组
right--分组的时候,右边是否闭合
labels--分组的自定义标签,可以不自定义
import pandas data = pandas.read_csv( 'D:\\PDA\\4.15\\data.csv', sep='|' ) bins = [ min(data.cost)-1, 20, 40, 60, 80, 100, max(data.cost)+1 ] data['cut'] = pandas.cut( data.cost, bins ) data['cut'] = pandas.cut( data.cost, bins, right=False ) labels = [ '20以下', '20到40', '40到60', '60到80', '80到100', '100以上' ] data['cut'] = pandas.cut( data.cost, bins, right=False, labels=labels )4.16时间处理
1)、时间转换
时间转换,指将字符型的时间格式数据转换成时间型数据的过程
转换函数:datatime=pandas.to_datatime(dataString,format)
%Y--年份,%m--月份,%d--日期,%H--小时,%M--分钟,%S--秒。注意大小写。
data['时间'] = pandas.to_datetime(
data.注册时间,
format='%Y/%m/%d'
)
data['格式化时间'] = data.时间.dt.strftime('%Y-%m-%d')
2)、时间格式化
是指将时间型数据,按照指定格式,转换为字符型数据
函数:dateTimeFormat = datetime.dt.strftime(format)
3)、时间属性抽取
日期抽取,是指从日期格式里面,抽取出需要的部分属性
语法:datatime.dt.property
second--1-60秒,minute--1-60分钟,hour--1-24小时,day--1-31天,month--1-12月,year--年份,weekday--1-7一周中的第几天
data['时间.年'] = data['时间'].dt.year
data['时间.月'] = data['时间'].dt.month
data['时间.周'] = data['时间'].dt.weekday
import pandas data = pandas.read_csv( 'D:\\PDA\\4.16\\data.csv', encoding='utf8' ) data['时间'] = pandas.to_datetime( data.注册时间, format='%Y/%m/%d' ) data['格式化时间'] = data.时间.dt.strftime('%Y-%m-%d') data['时间.年'] = data['时间'].dt.year data['时间.月'] = data['时间'].dt.month data['时间.周'] = data['时间'].dt.weekday data['时间.日'] = data['时间'].dt.day data['时间.时'] = data['时间'].dt.hour data['时间.分'] = data['时间'].dt.minute data['时间.秒'] = data['时间'].dt.second4.17时间抽取
是指根据一定的条件,对时间格式的数据进行抽取
根据索引进行抽取:
DataFrame.ix[start:end]
DataFrame.ix[dataes]
根据时间列进行抽取:
DataFrame[condition]
# -*- coding: utf-8 -*- import pandas data = pandas.read_csv( 'D:\\PDA\\4.17\\data.csv', encoding='utf8' ) dateparse = lambda dates: pandas.datetime.strptime( dates, '%Y%m%d' ) data = pandas.read_csv( 'D:\\PDA\\4.17\\data.csv', encoding='utf8', parse_dates=['date'], date_parser=dateparse, index_col='date' ) #根据索引进行抽取 import datetime dt1 = datetime.date(year=2016,month=2,day=1); dt2 = datetime.date(year=2016,month=2,day=5); data.ix[dt1: dt2] data.ix[[dt1,dt2]] #根据时间列进行抽取 data = pandas.read_csv( 'D:\\PDA\\4.17\\data.csv', encoding='utf8', parse_dates=['date'], date_parser=dateparse, ) data[(data.date>=dt1) & (data.date<=dt2)]4.18虚拟变量
也叫哑变量和离散特征编码,可用来表示分类变量、非数量因素可能产生的影响
1、离散特征的数值之间有大小的意义,如尺寸(L、XL、XXL)
2、离散特征的取值之间没有大小的意义,如颜色
1)、有大小意义的处理函数:pandas.Series.map(dict)
2)、没有大小意义的处理函数:
pandas.get._dummies(data,prefix=None,prefix_sep='_',dummy_na=False,columns=None,drop_first=False)
data--要处理的DataFram
prefix--列名的前缀,在多个列有相同的离散项时使用
prefix_sep--前缀和离散值的分隔符,默认为下划线
dummy_na--是否把NA值作为一个离散值来处理,默认不处理
columns--要处理的列名,如果不指定该列,那么默认处理所有列
drop_first--是否从备选项中删第一个,建模的时候为避免共线性使用
# -*- coding: utf-8 -*- import pandas data = pandas.read_csv( 'D://dataloop//python_work//DataAnalysis\\4.18\\data.csv', encoding='utf8' ) data['Education Level'].drop_duplicates() """ 博士后 Post-Doc 博士 Doctorate 硕士 Master's Degree 学士 Bachelor's Degree 副学士 Associate's Degree 专业院校 Some College 职业学校 Trade School 高中 High School 小学 Grade School """ educationLevelDict = { 'Post-Doc': 9, 'Doctorate': 8, 'Master\'s Degree': 7, 'Bachelor\'s Degree': 6, 'Associate\'s Degree': 5, 'Some College': 4, 'Trade School': 3, 'High School': 2, 'Grade School': 1 } data['Education Level Map'] = data[ 'Education Level' ].map( educationLevelDict ) data['Gender'].drop_duplicates() dummies = pandas.get_dummies( data, columns=['Gender'], prefix=['Gender'], prefix_sep="_", dummy_na=False, drop_first=False ) dummies['Gender'] = data['Gender']