数据分析:数据处理篇3

数据的合并

在现实生活中我们会经常遇到类似这样的情况,有多个Excel文件,只有综合起来才能得到一个问题完整的数字特征。遇到这样的情况,就需要我们将数据进行合并再加以分析。数据合并主要有两种操作:轴向连接(concatenation)以及融合(merge)。给大家一一介绍:

concatenation函数

首先看concatenation()函数的参数和使用方法:

pd.concat(objs, axis=0, join='outer',ignore_index=False)

其中,objs对应的是要进行连接的内容,以列表形式传递参数,列表内元素均为series、dataframe或panel三种类型之一;
axis是需要合并连接的轴,默认为0(行连接),可改为1(列连接);
join为连接方式,默认为outer,可选为inner。outer连接方式会将objs提供的数据列表的所有列及内容都予以保存,没有数值的用NaN进行填充;inner连接方式则仅显示objs提供的数据列表里共有的列名所包含的数据;
ignore_index参数默认为False,它的意义在于,当我们想要连接的数据的轴向索引没有意义时,将其置为True可以使用位置索引重置行索引。
下面我们看一个实例:

import pandas as pd
dict1={
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3'],
    'C': ['C0', 'C1', 'C2', 'C3']}
df1=pd.DataFrame(dict1,index = ['e','f','c','d'])

dict2={
    'B': ['B0', 'B1', 'B2', 'B3'],
    'C': ['C0', 'C1', 'C2', 'C3'],
    'D': ['D0', 'D1', 'D2', 'D3'],}
df2=pd.DataFrame(dict2,index = ['a','b','c','d'])
ands=pd.concat([df1,df2], axis=0, join='inner') 
# inner只保留并合并共有的列
print('df1和df2按行进行inner链接:','\n',ands)
ands=pd.concat([df1,df2], axis=0,ignore_index=True)
# 默认outer保留并合并所有的列
# 将行索引重置为位置索引
print('df1和df2按行进行outer链接:','\n',ands)
ands=pd.concat([df1,df1])
print('df1和df1按行进行outer链接:','\n',ands)
ands=pd.concat([df1,df1],axis=1,ignore_index=True)
print('df1和df1按列进行outer链接重置索引:','\n',ands)
ands=pd.concat([df1,df1],axis=1)
print('df1和df1按列进行outer链接不重置索引:','\n',ands)

先来看看结果:
在这里插入图片描述

在这里插入图片描述

从结果中发现了一个问题,就是这种连接方式不会对每行(按行连接时)或每列(按列连接时)重复数据进行判断和处理,只会按照指定的方式进行数据的堆砌。
如果我们需要对这类重复的数据进行处理再连接,可以选择使用merge()函数。

merge函数

merge()函数通过指定连接键拼接列数据,通常用于合并两个DataFrame类型的数据,并且拥有更多的连接方式,我们先来看常用的参数:

merge(left, right, how='inner', on=None)

参数介绍:
left和right:两个要合并的DataFrame类型数据;
how:连接方式,有inner、left、right、outer,默认为inner;
on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键。
下面来看一组实例:

import pandas as pd
left = pd.DataFrame({'key':['a','b','b','d'],'data1':range(4),'f':range(4)})
right = pd.DataFrame({'key':['a','b','c'],'data2':range(3),'f':range(3)})
print(left,right,sep='\n')
new1=pd.merge(left,right)
# 如果on不设置,默认设置为两列表中所有的重复列索引,对应的元素全一样时,才会对列进行填充,否则添加到新的行
print(new1)

在这里插入图片描述
从这个结果中可以得到的信息为,merge默认使用inner的方式连接,并且被连接的两组数据要合并共有列内容均相同的数据,而共有列内容不完全相同的数据将被删除。
我们可以改变how以及on的参数改变连接方式,比如:

new2=pd.merge(left,right,on=['key'])
print(new2)

这个例子中以共有列key作为交集进行连接,而两者都有的f列,则会被函数加上_x和_y区别:
在这里插入图片描述
注意这两个b,因为我们使用key列作为链接依据的,所以这两个b都会被保存。我们可以理解成列表二中b的f和data2两列会分别添加到列表一的b中去,然后再不改变原有数据集的基础上构建出一个新的数据集。
同样也可以改变连接方式,比如做outer连接:

print(new1)
new2=pd.merge(left,right,on=['key'],how='outer')
print(new2)

在这里插入图片描述
可以看出,对key列对应相同的行操作和刚才一样,而key列不同的行也会保留,对应有空值则以NaN填补;此外,f_x对应的是left列表中的f,f_y对应right列表中的f。
然后再看看how的参数为right和left时会出现的情况,以left连接为例:

new3=pd.merge(left,right,how='left')
# left连接时,只要left表中出现就会出现在合并后的表格中,on指定列里对应的元素
# 如果只有在right中出现则被直接删掉;对应相同的元素多余的信息将补充到left里去。
print(new3)

new4=pd.merge(right,left,how='left')
# 颠倒传入列表的顺序,注意data1和data2的顺序
print(new4)

看到结果之后要认真理解一下注释:
在这里插入图片描述
注:以上合并都是新建了一个数据集存储合并后的内容,都不会改变原有的两个数据集!

数据筛选

在之前的讲述中,我们学会了如何合并数据。实际工作中,我们经常需要处理非常大量的数据,而挑选其中满足条件的数据是基操,所以接下来我们学习数据的筛选。大家可以先下载一下学习资料
我们先查看一下数据的基本结构:

import pandas as pd
df = pd.read_csv('mouhu_users_2017.csv')
print(df.head())

在这里插入图片描述
接下来我们尝试保存关注量在100以上的数据。我们可以先找到满足条件的
位置索引,然后存储为新的数据集加以打印。有了思路,就来实操一下:

import pandas as pd
df = pd.read_csv('mouhu_users_2017.csv')
print(df.head())
bools= df['关注者']>100
print(bools) # bools是Series数据,由默认列索引和一行数据组成
print(type(bools)) # 一行n列的数据,列索为
df1 = df[bools] # 将布尔值为真的列号作为df中需要保存的数据的行号,将数据存储到df1数据表中
# df1=df[df['关注者']>100]
print(df1.shape)
print(df1)

仔细观察注释,不理解的可以参考输出的结果:
在这里插入图片描述
如果需要针对多列进行筛选,只需要再加一个用于判断的Series类型的bools,然后两者做和连接:

import pandas as pd
df = pd.read_csv('mouhu_users_2017.csv')
bools1= df['关注者']>1500
bools2=df['关注']>1000
bools3=df['关注的问题']>100
df1 = df[bools1 & bools2]
print('df1对应的数据集为:','\n',df1)
df2 = df[bools1 & bools2 & bools3]
print('df2对应的数据集为:','\n',df2)

在这里插入图片描述
在这里插入图片描述
这种方法可以帮我们完成对多列数据的筛选,加下来我们学习数据排序。

数据排序

现实生活中,很多时候数据的排序方式与我们想要的不同,比如筛选中使用的例子,是按照id号进行排序的,然而我们更希望它是按照筛选内容递增(或递减)的形式排列,这样排列的数据才鞥具有实用意义。那么如何完成呢?下载世界年龄抚养比率数据

sort_index方法

sort_index()方法是可以配合Excel表格读取到内容的排序方法,在读取的时候可以指定某一列的数据作为行索引,然后在利用sort_index()方法对行索引进行顺序排列。下面用程序来验证一下:

import pandas as pd
df = pd.read_excel('rate.xlsx',index_col='Country Code')
# index_col='CountryName'为选定'Country Code'这列数据作为行索引
df=df.sort_index(inplace=False,ascending=True)
# inplace和之前一样,True在原数据集上做改动False新建一个数据集,
# 无论选哪个参数都不会影响.xlsx文件的内容
# ascending规定数据的排序方式,默认值为True,从小到大排列。
print(df.head())

在这里插入图片描述
这样就满足设定啦。

sort_values方法

sort_values()方法与sort_index()方法类似,也是通过ascending参数的值规定排序的方式,但是sort_values()方法可以指定要针对哪一列的数据进行排序,观察以下代码:

import pandas as pd
df = pd.read_excel('rate.xlsx')
df.sort_values(by='Country Code',ascending=False,inplace=True)
# 在sort_values()方法中,by可以指定一列(Country Code)作为排序依据
print(df.head(10))

sort_values()方法比sort_index()方法多了一个可以指定列索引的参数,因此更适合针对.csv文件的排序。看一下运行结果,关注两种方法输出的不同:
在这里插入图片描述
sort_index()方法依据read_excel()指定排序依据的列,所以排序完成之后,这一列的数据会放到数据集的第一列,而sort_values()方法则不会这样,数据原本列的位置不会变动。

实战应用

下面我们用一个练习结束今天的学习,首先下载练习资料
这是一个第六次全国人口普查中的常住人口数据,我们从中过滤掉省的信息,找到常住人口前十的市和区:

import pandas as pd
from pandas import DataFrame
df=pd.read_csv('./liupu.csv')
print(df.head(10))
# series.str会将每一个数据转换成字符串
# contains()判断字符串是否含有指定子符,返回的是bool类型
bools = df['结尾'].str.contains("市")

df1=df[bools]
df1.sort_values(by='常住人口',ascending=False,inplace=True)
print(df1.head(10))

bools=(df['结尾']=="市")
df2=df[bools]
df2.sort_values(by='常住人口',ascending=False,inplace=True)
print(df2.head(10))

我们先看看列表的结构:
在这里插入图片描述
以上是两种查找方式,都可以得到我们想要的结果。认真观察注释,我们看看最终的运行结果:
在这里插入图片描述
得到的结果相同。
本节向大家介绍了数据的合并、筛选和排序三种对数据集的基本操作,这些都是数据整理中比较重要的技能。学会的小伙伴记得自己练习一下,熟悉这些操作可以大大提升工作效率~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值