目录
数据合并之join
join:默认情况下他是把行索引相同的数据合并到一起(合并后的数据的行根据join前面的数组行索引)
In [16]: t1
Out[16]:
x y z
A 0.0 0.0 0.0
B 0.0 0.0 0.0
C 0.0 0.0 0.0
In [19]: t3
Out[19]:
w e r
A 1.0 1.0 1.0
B 1.0 1.0 1.0
In [20]: t1.join(t3)
Out[20]:
x y z w e r
A 0.0 0.0 0.0 1.0 1.0 1.0
B 0.0 0.0 0.0 1.0 1.0 1.0
C 0.0 0.0 0.0 NaN NaN NaN
In [21]: t3.join(t1)
Out[21]:
w e r x y z
A 1.0 1.0 1.0 0.0 0.0 0.0
B 1.0 1.0 1.0 0.0 0.0 0.0
数据合并之merge
merge:按照指定的列索引把数据按照一定的方式合并到一起
语法:
pd.merge(df1, df2, 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)
参数详解:
- df1:待拼接的左侧数据
- df2:待拼接的右侧数据
- how:左右两个数据框的连接方式。可选‘left’、‘right’、‘outer’、‘inner’,默认为inner。
- on:左右两个待拼接数据框有共同列名,且按该列拼接两个数据框时使用该参数。
- left_on:拼接两个数据框时,左数据框对应连接关键字(可为列表)。
- right_on:拼接两个数据框时,右数据框对应连接关键字(可为列表)。
- left_index:若为True,则按左数据框的索引连接两个数据框。
- right_index:若为True,则按右数据框的索引连接两个数据框。
- sort:按字典顺序通过连接键对结果数据框进行排序。
- suffixes:为左右数据框中重复列名定义后缀。默认加('x','y')。
练习:
1.以默认的方式连接两个数据框(在没有指定连接键的时候,会按照相同的列索引name作为连接键,,即等价于on=‘name’;默认参数how是inner内连接,取两侧数据的交集)
In [34]: pd.merge(df1,df2)
Out[34]:
name tel age
0 zhang 10000 30
2.左连接 how=left (左侧df1取全部数据,右侧df2匹配左侧数据,没有的用NaN填充。默认情况下还是on=‘name’)
In [35]: pd.merge(df1,df2,how="left")
Out[35]:
name tel age
0 zhao 10086 NaN
1 qian 10010 NaN
2 zhang 10000 30.0
3.右连接 how=right (右侧df2取全部数据,左侧df1匹配右侧数据,没有的用NaN填充。默认情况下还是on=‘name’)
In [36]: pd.merge(df1,df2,how="right")
Out[36]:
name tel age
0 zhang 10000.0 30
1 li NaN 20
以上3种情况都是属于内连接
4.外连接 how=outer (取左右连接的并集,保留所有信息)
In [37]: pd.merge(df1,df2,how="outer")
Out[37]:
name tel age
0 zhao 10086.0 NaN
1 qian 10010.0 NaN
2 zhang 10000.0 30.0
3 li NaN 20.0
5. 以index做为连接键 (若两个数据框除连接键外,还有相同列名,默认左侧数据框中的相同列名后加_x,右侧数据框中相同列名后加_y,见上图中的name_x和name_y。)
In [38]: pd.merge(df1, df2, how= 'inner',left_index=True,right_index=True)
Out[38]:
name_x tel name_y age
0 zhao 10086 li 20
1 qian 10010 zhang 30
从上面可以发现两个DataFrame中都有name列,merge合并之后,pandas会自动在后面加上(_x,_y)来区分,我们也可以通过设置suffixes来设置名字。
In [47]: pd.merge(df1, df2, how= 'inner',left_index=True,right_index=True,suffixes=("_df1","_df2"))
Out[47]:
name_df1 tel name_df2 age
0 zhao 10086 li 20
1 qian 10010 zhang 30
6.用sort对连接键值进行排序
In [49]: pd.merge(df1,df2,how= 'outer',sort="True")
Out[49]:
name tel age
0 li NaN 20.0
1 qian 10010.0 NaN
2 zhang 10000.0 30.0
3 zhao 10086.0 NaN