数据分析------数据处理(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

--------------------------------------------

这里暂时只讲到数据导入、数据导出、数据清洗、数据抽取,后面将会讲到的还有数据处理的其他部分,如:插入记录、修改记录等。

posted on 2019-05-12 14:50  终是双曲线  阅读(677)  评论(0编辑  收藏  举报

导航