数据分析------数据处理(1)
1、数据导入
数据存在的形式多种多样,如文件有 csv、Excel、txt 格式,数据库有 MySQL、Access、SQL Server 等形式。
1.1 导入 txt 文件
read_table 函数,导入 txt 文件,格式如下:
read_table(file, names=[列名1,列名2,...], spe = "", ...)
其中,file 为文件路径与文件名;
names 为列名,默认为文件中的第一行作为列名;
sep 为分隔符,默认为空。
注意:(1)txt 文本文件要保存成 UTF-8 格式才不会报错;
(2)查看数据框 df 前 n 项数据使用 df.head(n) ;后 m 项数据用 df.tail(m) 。默认均是 5 项数据。
1.2 导入 csv 文件
read_csv 函数,导入 csv 文件,格式如下:
read_csv(file, names=[列名1,列名2,...], spe = "", ...)
其中,file 为文件路径与文件名;
names 为列名,默认为文件中的第一行作为列名;
sep 为分隔符,默认为空,表示默认导入为第一列。
1.3 导入 Excel 文件
read_excel 函数,导入 Excel 文件,格式如下:
read_excel (file, sheetname, header = 0)
其中,file 为文件路径和文件名;
sheetname 为 sheet 的名称,如 sheet1 ;
header为列名,默认为 0(只接收布尔型数据 0 和 1),一般以文件的第一行作为列名。
注意:(1)header 取 0 和 1 的差别,取 0 表示以文件第一行作为表头显示,取 1 表示把文件第一行丢弃,不作为表头显示。有时可以跳过首行或者读取多个表;
(2)sheetname 可以指定为读取几个 sheet ,sheet 数目从 0 开始,如 sheetname=[0,2],则代表读取第 1 页和第 3 页的 sheet;skiprows=[0] 代表读取时跳过第 1 行。
2、数据导出
2.1 导出 csv 文件
to_csv函数,,导出csv文件,其格式如下:
to_csv (file _path, sep=",", index=TRUE, header=TRUE)
其中,file_path为文件路径;
sep为分隔符,默认是逗号;
index表示是否导出行序号,默认是TRUE,导出行序号;
header表示是否导出列名,默认是TRUE,导出列名。
2.2 导出 Excel 文件
to_excel 函数,导出 Excel 文件,其格式如下:
to_excel (file _path, index=TRUE, header=TRUE)
其中,file_path为文件路径;
index表示是否导出行序号,默认是TRUE,导出行序号;
header表示是否导出列名,默认是TRUE,导出列名。
3、数据清洗
数据处理的主要内容包括数据清洗、数据抽取、数据交换和数据计算等。
数据清洗是数据价值链中最为关键的步骤,数据清洗就是处理缺失数据以及清除无意义的信息,如删除原始数据中的无关数据、重复数据等。
3.1 重复值的处理
在Pandas模块中去掉重复的数据,步骤如下:
(1)利用 DataFrame 中的 duplicated 方法,返回一个布尔型的 Series,显示是否有重复行,没有重复的行显示为 FALSE,有重复的行则从第二行起均显示为 TRUE;
(2)再利用 DataFrame 中的 drop_duplicates 方法返回一个移除了重复行的 DataFrame。
duplicated 方法如下:
duplicated(self, subset=None, keep='first')
其中,subset 用于识别重复的列标签或列标签序列,默认所有列标签;
keep= 'fist' 表示除了第一次出现外,其余相同的数据被标记为重复;
keep = 'last' 表示除了最后一次出现外,其余相同的数据被标记为重复;
keep= False表示所有相同的数据都被标记为重复。
如果 duplicated 方法和 drop_ duplicates 方法中没有设置参数,则这两个方法默认判断全部列;如果在这两个方法中加入了指定的属性名(或者称为列名),例如 fame.drop_ dup licates(['state']),则指定部分列( state列)进行重复项的判断。
drop_ duplicates 方法用于把数据结构中行相同的数据去除(保留其中的一行)。
代码示例如下:
In [1]: from pandas import DataFrame from pandas import Series df = DataFrame(({'age': Series([26,85,64,85,85]),'name': Series(['Ben','John','Jerry",'John','John'])}) df Out[1]: age name 0 26 Ben 1 85 John 2 64 Jerry 3 85 John 4 85 John In [2]: df.duplicated() Out[2]: 0 False 1 False 2 False 3 True 4 True dtype: bool In[3]: df.duplicated('name') out[3]: 0 False 1 False 2 False 3 True 4 True dtype: bool In[4]: df.drop_duplicates('age') out[4]: age name 0 26 Ben 1 85 John 2 64 Jerry
3.2 缺失值处理
缺失值的处理包括以下两个步骤:
(1)缺失数据的识别
Pandas 使用浮点值 NaN 表示浮点和非浮点数组里的缺失数据,并使用 .isnull 和 .notnull 函数来判断缺失情况。
In [1]: from pandas import DataFrame from pandas import read_excel df = read_excel(r'c:\Users\test\test.xisx', sheetname = 'Sheet2') df Out[1]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 张波 85 NaN 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 7 2308024307 陈田 76 69.0 NaN 69 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46 In[2]: df.isnull() Out[2]: 学号 姓名 英语 数分 高代 解几 0 False False False False False False 1 False False False False False False 2 False False False True False False 3 False False False False False False 4 False False False False False False 5 False False False False False False 6 False False False False False False 7 False False False False True False 8 False False False False False False 9 False False False False False False In[3]: df.notnull() Out[3]: 学号 姓名 英语 数分 高代 解几 0 True True True True True True 1 True True True True True True 2 True True True False True True 3 True True True True True True 4 True True True True True True 5 True True True True True True 6 True True True True True True 7 True True True True False True 8 True True True True True True 9 True True True True True True
(2)缺失数据的处理
对于缺失数据的处理方式有以下几种:
① dropna():去除数据结构中值为空的数据行;
In [4]:newDF = df.dropna() newDF Out[4]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
② df.fillna():用其他数据值代替 NaN,有事直接删除空数据会影响分析结果,因此可以对数据进行补充;
In [5]: df.fillna('?') Out[5]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 张波 85 ? 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 7 2308024307 陈田 76 69.0 ? 69 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
③ df.fillna(methon='pad'):用前一个数据值代替 NaN ;
In [6]: df.fillna(method='pad') Out[6]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 张波 85 47.0 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 7 2308024307 陈田 76 69.0 65.0 69 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
④ df.fillna(method='bfill'):用后一个数据值代替 NaN ;
In [7]: df.fillna(method='bfill') Out[7]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 张波 85 72.0 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 7 2308024307 陈田 76 69.0 61.0 69 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑤ df.fillna(df.mean()):用平均值或者其他描述性统计量来代替 NaN ;
In [8]: df.fillna(df.mean()) Out[8]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 张波 85 60.778 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 7 2308024307 陈田 76 69.0 52.556 69 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑥ df.fillna(df.mean()['填补列名':'计算均值的列名']):可以使用选择列的均值进行缺失值的处理 ;
In [9]: df.fillna(df.mean()['高代':'解几']) Out[9]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 张波 85 NaN 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 7 2308024307 陈田 76 69.0 52.556 69 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑦ df.fillna({'列名1':值1, '列名2':值2}):可以传入一个字典,对不同的列填充不同的值;
In [10]: df.fillna({'数分':100 , '高代':0 }) Out[10]: 学号 姓名 英语 数分 高代 解几 0 2308024241 成龙 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 张波 85 100.0 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李华 67 61.0 65.0 78 7 2308024307 陈田 76 69.0 0.0 69 8 2308024326 余皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑧ strip():清除字符型数据左右(首尾)指定的字符,默认为空格,中间的不清除。
In [11]: from pandas import DataFrame from pandas import Series df = DataFrame(({'age': Series([26,85,64,85,85]),'name': Series(['Ben','John','Jerry",'John','John'])}) df Out[11]: age name 0 26 Ben 1 85 John 2 64 Jerry 3 85 John 4 85 John In[12]:df['name'].str.strip() Out[12]: 0 Ben 1 John 2 Jerry 3 John 4 John Name: name, dtype: object
4、数据抽取
4.1 字段抽取
抽出某列上指定位置的数据做成新的列,格式如下:
slice (start, stop)
其中,start 表示开始位置,stop 表示结束位置。
4.2 字段拆分
按指定的字符 sep ,拆分已有的字符串,格式如下:
split(sep , n , expand = False)
其中,sep 表示用于分割字符串的分隔符;n 表示分割后新增的列数; expand 表示是否展开为数据框,默认为 FALSE ,返回 Series,若为 TRUE,返回 DataFrame。
4.3 重置索引
指定某列为索引,以便于对其他数据进行操作,格式如下:
df.set_index('列名')
示例代码如下:
In [1]: from pandas import DataFrame from pandas import Series df = DataFrame(({'age': Series([26,85,64,85,85]),'name': Series(['Ben','John','Jerry",'John','John'])}) df1 = df.set_index('name') df1 Out[1]: name age Ben 26 John 85 Jerry 64 John 85 John 85 In[2]: df1.ix['John'] #ix函数是指通过行标签或者行号索引行数据,类似还有 loc、iloc等。 Out[2]: name age John 85 John 85 John 85
4.4 记录抽取
根据一定条件,对数据进行抽取,格式如下:
df[condition]
其中,condition 表示过滤条件,返回值为 DataFrame ,常见的 condition 类型有:比较运算、范围运算、空置运算、字符匹配和逻辑运算等。
4.5 随机抽样
随机从数据中按照一定的行数或者比例抽取数据,格式如下:
numpy.random.randint(start , end , num)
其中,参数分别表示范围开始值、结束值、抽样个数。返回值为行的索引值序列。
代码示例如下:
In[1]: from pandas import read_excel df = read_excel(r'C:\Users\test\test4.xls) df.head() Out[1]: 学号 电话 0 2308024241 18922254812 1 2308024244 13522255003 2 2308024251 13422259938 3 2308024249 18822256753 4 2308024219 18922253721 In[2]: r = numpy.random.randint(0,3,2) Out[2]: 学号 电话 0 2308024241 18922254812 3 2308024249 18822256753
4.6 通过索引抽取数据
(1)使用索引名(标签)选取数据:df.loc[行标签 , 列标签]
df.loc 的第一个参数为行标签,第二个参数为列标签(可选,默认所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表,则返回 DataFrame ,否则为 Series 。当同时抽取多行时,行的索引必须是列表的形式,而不能简单地用逗号分隔。
(2)使用索引号选取数据:df.loc[行索引号,列索引号]
4.7 字典数据抽取
值将字典数据抽取为 DataFrame,有如下三种方法:
(1)字典的 key 和 value 各作为一列,示例代码如下:
In[1]: import pandas from pandas import DataFrame d1 = {'a':'[1,2,3]' , 'b':'[0,1,2]'} a1 = pandas.DataFrame.from_dict(d1, orient = 'index') #将字典转化为 DataFrame,且key 列做成了 index a1.index.name = 'key' #将 index 的列名改为 'key' b1 = a1.reset_index() #重新增加 index,并将原 index 做成了 'key'列 b1.columns = ['key' , 'value'] #对列重新命名为 'key' 和 'value' b1 Out[1]: key value 0 b [0,1,2] 1 a [1,2,3]
(2)字典里的每一个元素作为一列(同长),示例代码如下:
In[2]:d2 = {'a':'[1,2,3]' , 'b':'[0,1,2]'} #字典的 value 必须长度相等 a2 = DataFame(d2) a2 Out[2]: a b 0 1 4 1 2 5 2 3 6
(3)字典里的每一个元素作为一列(不同长),示例代码如下:
In[3]: d = {'one' : pandas.Series([1,2,3]) , 'two' : pandas.Series([1,2,3,4])} #字典的 value 必须长度可以不等 df = pandas.DataFrame(d) df Out[3]: one two 0 1.0 1 1 2.0 2 2 3.0 3 3 NaN 4
--------------------------------------------
这里暂时只讲到数据导入、数据导出、数据清洗、数据抽取,后面将会讲到的还有数据处理的其他部分,如:插入记录、修改记录等。