zoukankan      html  css  js  c++  java
  • 数据分析------数据处理(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	est	est.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	est	est4.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

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

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

  • 相关阅读:
    第十八课 顺序存储线性表的分析
    第十七课 StaticList和DynamicList实现
    第十六课 顺序存储结构的抽象实现
    第十五课 线性表的顺序存储结构
    第十四课 线性表的本质和操作
    第十三课 类族结构的进化
    第十二课 顶层父类的创建
    第十一课 异常类构建
    HDU 5773The All-purpose Zero
    HDU 5755 Gambler Bo
  • 原文地址:https://www.cnblogs.com/lifengB511/p/10848862.html
Copyright © 2011-2022 走看看