• 用Python做数据分析之数据处理及数据提取


    1、数据预处理
    第四部分是数据的预处理,对清洗完的数据进行整理以便后期的统计和分析工作。主要包括数据表的合并,排序,数值分列,数据分组及标记等工作。

    1)数据表合并
    首先是对不同的数据表进行合并,我们这里创建一个新的数据表 df1,并将 df 和 df1 两个数据表进行合并。在 Excel 中没有直接完成数据表合并的功能,可以通过 VLOOKUP 函数分步实现。在 python 中可以通过 merge 函数一次性实现。
    下面建立 df1 数据表,用于和 df 数据表进行合并。
    1 #创建 df1 数据表
    2 df1=pd.DataFrame({‘id’:[1001,1002,1003,1004,1005,1006,1007,1008],
    3 ‘gender’:[‘male’,‘female’,‘male’,‘female’,‘male’,‘female’,‘male’,‘female’],
    4 ‘pay’:[‘Y’,‘N’,‘Y’,‘Y’,‘N’,‘Y’,‘N’,‘Y’,],
    5 ‘m-point’:[10,12,20,40,40,40,30,20]})

    使用 merge 函数对两个数据表进行合并,合并的方式为 inner,将两个数据表中共有的数据匹配到一起生成新的数据表。并命名为 df_inner。
    1#数据表匹配合并,inner 模式
    2df_inner=pd.merge(df,df1,how=‘inner’)

    除了 inner 方式以外,合并的方式还有 left,right 和 outer 方式。这几种方式的差别在我其他的文章中有详细的说明和对比。
    1#其他数据表匹配模式
    2df_left=pd.merge(df,df1,how=‘left’)3df_right=pd.merge(df,df1,how=‘right’)4df_outer=pd.merge(df,df1,how=‘outer’)

    2)设置索引列
    完成数据表的合并后,我们对 df_inner 数据表设置索引列,索引列的功能很多,可以进行数据提取,汇总,也可以进行数据筛选等。
    设置索引的函数为 set_index。
    1#设置索引列
    2df_inner.set_index(‘id’)

    3)排序(按索引,按数值)
    Excel 中可以通过数据目录下的排序按钮直接对数据表进行排序,比较简单。Python 中需要使用 ort_values 函数和 sort_index 函数完成排序。
    在 python 中,既可以按索引对数据表进行排序,也可以看制定列的数值进行排序。首先我们按 age 列中用户的年龄对数据表进行排序。
    使用的函数为 sort_values。
    1#按特定列的值排序
    2df_inner.sort_values(by=[‘age’])

    函数用来将数据表按索引列的值进行排序。
    1#按索引列排序
    2df_inner.sort_index()

    3)数据分组
    Excel 中可以通过 VLOOKUP 函数进行近似匹配来完成对数值的分组,或者使用“数据透视表”来完成分组。相应的 python 中使用 where 函数完成数据分组。
    Where 函数用来对数据进行判断和分组,下面的代码中我们对 price 列的值进行判断,将符合条件的分为一组,不符合条件的分为另一组,并使用 group 字段进行标记。
    1#如果 price 列的值>3000,group 列显示 high,否则显示 low
    2df_inner[‘group’] = np.where(df_inner[‘price’] > 3000,‘high’,‘low’)

    除了 where 函数以外,还可以对多个字段的值进行判断后对数据进行分组,下面的代码中对 city 列等于 beijing 并且 price 列大于等于 4000 的数据标记为 1。
    1#对复合多个条件的数据进行分组标记
    2df_inner.loc[(df_inner[‘city’] == ‘beijing’) & (df_inner[‘price’] >= 4000), ‘sign’]=1

    4)数据分列
    与数据分组相反的是对数值进行分列,Excel 中的数据目录下提供“分列”功能。在 python 中使用 split 函数实现分列。
    在数据表中 category 列中的数据包含有两个信息,前面的数字为类别 id,后面的字母为 size 值。中间以连字符进行连接。我们使用 split 函数对这个字段进行拆分,并将拆分后的数据表匹配回原数据表中。

    1 #对 category 字段的值依次进行分列,并创建数据表,索引值为 df_inner 的索引列,列名称为 category 和 size
    2 pd.DataFrame((x.split(‘-’) for x in df_inner[‘category’]),index
    =df_inner.index,columns=[‘category’,‘size’])

    1#将完成分列后的数据表与原 df_inner 数据表进行匹配
    2df_inner=pd.merge(df_inner,split,right_index=True, left_index=True)

    2、数据提取
    第五部分是数据提取,也是数据分析中最常见的一个工作。这部分主要使用三个函数,loc,iloc 和 ix,loc 函数按标签值进行提取,iloc 按位置进行提取,ix 可以同时按标签和位置进行提取。下面介绍每一种函数的使用方法。

    1)按标签提取(loc)
    Loc 函数按数据表的索引标签进行提取,下面的代码中提取了索引列为 3 的单条数据。
    1#按索引提取单行的数值
    2df_inner.loc[3]3id 10044date 2013-01-05 00:00:005city shenzhen6category 110-C7age 328price 54339gender female10m-point 4011pay Y12group high13sign NaN14category_1 11015size C16Name: 3, dtype: object

    使用冒号可以限定提取数据的范围,冒号前面为开始的标签值,后面为结束的标签值。下面提取了 0 到 5 的数据行。
    1#按索引提取区域行数值
    2df_inner.loc[0:5]

    Reset_index 函数用于恢复索引,这里我们重新将 date 字段的日期设置为数据表的索引,并按日期进行数据提取。
    1#重设索引
    2df_inner.reset_index()

    1#设置日期为索引
    2df_inner=df_inner.set_index(‘date’)

    使用冒号限定提取数据的范围,冒号前面为空表示从 0 开始。提取所有 2013 年 1 月 4 日以前的数据。

    1#提取 4 日之前的所有数据
    2df_inner[:‘2013-01-04’]

    2)按位置提取(iloc)
    使用 iloc 函数按位置对数据表中的数据进行提取,这里冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从 0 开始。
    1#使用 iloc 按位置区域提取数据
    2df_inner.iloc[:3,:2]

    iloc 函数除了可以按区域提取数据,还可以按位置逐条提取,前面方括号中的 0,2,5 表示数据所在行的位置,后面方括号中的数表示所在列的位置。
    1#使用 iloc 按位置单独提取数据
    2df_inner.iloc[[0,2,5],[4,5]]

    3)按标签和位置提取(ix)
    ix 是 loc 和 iloc 的混合,既能按索引标签提取,也能按位置进行数据提取。下面代码中行的位置按索引日期设置,列按位置设置。
    1#使用 ix 按索引标签和位置混合提取数据
    2df_inner.ix[:‘2013-01-03’,:4]

    4)按条件提取(区域和条件值)
    除了按标签和位置提起数据以外,还可以按具体的条件进行数据。下面使用 loc 和 isin 两个函数配合使用,按指定条件对数据进行提取 。
    使用 isin 函数对 city 中的值是否为 beijing 进行判断。
    1 #判断 city 列的值是否为 beijing
    2 df_inner[‘city’].isin([‘beijing’])
    3
    4 date
    5 2013-01-02 True
    6 2013-01-05 False
    7 2013-01-07 True
    8 2013-01-06 False
    9 2013-01-03 False
    10 2013-01-04 False
    11 Name: city, dtype: bool

    将 isin 函数嵌套到 loc 的数据提取函数中,将判断结果为 Ture 数据提取出来。这里我们把判断条件改为 city 值是否为 beijing 和 shanghai。如果是就把这条数据提取出来。
    1#先判断 city 列里是否包含 beijing 和 shanghai,然后将复合条件的数据提取出来。
    2df_inner.loc[df_inner[‘city’].isin([‘beijing’,‘shanghai’])]

    5)按筛选条件提取
    数值提取还可以完成类似数据分列的工作,从合并的数值中提取出制定的数值。
    1 category=df_inner[‘category’]
    2 0 100-A
    3 3 110-C
    4 5 130-F
    5 4 210-A
    6 1 100-B
    7 2 110-A
    8 Name: category, dtype: object
    9
    10 #提取前三个字符,并生成数据表
    11pd.DataFrame(category.str[:3])

    文章来源:网络 版权归原作者所有
    上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理

  • 相关阅读:
    【Linux】详解线程第一篇——由单线程到多线程的转变
    超越所有人的成就,牛顿的光芒也无法掩盖的天才数学巨人
    一、Java简介
    撬动农业价值天平,拼多多凭什么?
    如何能提高虚拟机上下载Hadoop压缩包的下载速度
    关于 Angular 里 module 和 Component 包含粒度的一个讨论
    训练自己的数据_ArcFace/InsightFace使用自己数据训练人脸识别(2/2)
    codesys【网桥】
    企业架构LNMP学习笔记9
    车载测试中:如何处理 bug
  • 原文地址:https://blog.csdn.net/xuezhangmen/article/details/134028493