一、Merging Dataframes:
首先,我们先复习一下上周所学的内容,上周主要是学习了Pandas中两个核心的数据结构:一维结构的Series和二维结构的DataFrame。查询这两个数据结构中的值有两种方式:第一种是行查询(row-based querying),通过使用loc、iloc属性;第二张是列查询(column-based querying),通过使用方括号操作符("[]")完成。而且还学习了通过Boolean Masking 来过滤数据。
1.向已存在的DataFrame内添加列:
通过之前的学习,我们已经知道了一种向DataFrame里添加数据的方式,即我们给带有新列名的方括号操作符赋值来达到这个目的。
但是这种方法有个局限就是,要求进行赋值的列表的长度必须要和DataFrame的index的长度一样,换句话说就是要把DataFrame里每一行这属性的值交代清楚,否则就会出现错误:
要注意的是,对于数值型数据(scalar value)例如,整数,字符串等等,上面的方法是可用的,具体地如下图所示:
那么,如果我们想给某一列的不同位置赋不同的值,那就必须创建一个和DataFrame的index的长度一样的list,list的里按顺序存放希望的内容(包括缺失值missing value):
如果,DataFrame里的每一行都有着唯一的索引,那么我们就可以通过索引给要添加的那列的具体位置赋值,这样做的好处就是可以不用自己填写缺失值。
2.合并DataFrame:
使用Pandas里的merge函数能完成将两个DataFrame合并的操作,该方法的签名为:
Pandas.merge(left,right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
主要参数介绍:
left:参与合并的左边的DataFrame(相当于SQL的join中的左表);
right:参数合并的右边的DataFrame(相当于SQL的join中的右表);
how:为合并的方式,分别为'inner','outer','left','right',默认为'inner'(相当于SQl中表连接的内连接、外链接、左链接和右连接,说白了就是:内连接是求交集;外连接是求并集;左连接是以左边的数据为准,查询出右边的数据;右连接则是反过来);
on:两个DataFrame用户连接的列名,必须同时存在于两个DataFrame中,如果未指定则为两个表的交集作为连接键;
left_on:左表用于连接的列(主要用户两个DataFrame不存在相同的列名时);
right_on:右表用于连接的列;
left_index:将左边的DataFrame的索引作为连接键;
right_index:将右边的DataFrame的索引作为连接键;
sort:根据连接键对合并的结果进行排序;
suffixes:字符串的元组,用于追加于重叠列名的末尾,默认为(_x,_y)
具体地我们通过代码来理解,先创建两个DateFrame
staff_df = pd.DataFrame([{'Name': 'Kelly', 'Role': 'Director of HR'},
{'Name': 'Sally', 'Role': 'Course liasion'},
{'Name': 'James', 'Role': 'Grader'}])
staff_df = staff_df.set_index('Name')
student_df = pd.DataFrame([{'Name': 'James', 'School': 'Business'},
{'Name': 'Mike', 'School': 'Law'},
{'Name': 'Sally', 'School': 'Engineering'}])
student_df = student_df.set_index('Name')
a.连接情况一:外连接
pd.merge(staff_df, student_df, how='outer', left_index=True, right_index=True)
这段代码的意思是,将staff_df和student_df进行外连接,将staff_df和student_df的索引作为连接键。最后得到的结果是:
b.连接情况二:内连接
pd.merge(staff_df, student_df, how='inner', left_index=True, right_index=True)