用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])

文章来源:网络  版权归原作者所有

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理

(0)

相关推荐