pandas常用表连接方法详解
在数据分析过程中,多个表之间的关联式很常见。这时候pandas提供的几种表连接方法——merge、join、concat、append就要上场了。这篇文章会详细讲解这四种方法的用法和区别,通过实例帮助读者深入理解。
merge方法
merge方法实现的是类似于SQL中的表连接。其函数定义为:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False,
right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
其中需要指定左表和右表,如果是基于index连接,那么要将left_index或right_index置为True;如果是基于列连接,那么需要指定列的名字,left_on,right_on,或者同时指定left_index和right_index为True。
merge的几种连接方式:
- inner join:内连接,取两表中相同的部分
- outer join:全连接,取两表中所有的内容
- left join:左连接,以左表为基础,连接右表。
- right join:右连接,以右表为基础,连接左表。
示例1
下面的例子演示的是如何基于两个键进行连接:
df1 = pd.DataFrame({'key1': ['K0', 'K1', 'K2', 'K3'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({'key1': ['K0', 'K1', 'K2', 'K3'],
'key2': ['K0', 'K0', 'K0', 'K1'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(df1, df2, on=['key1', 'key2'])
print(result)
输出结果如下:
key1 | key2 | A | B | C | D | |
---|---|---|---|---|---|---|
0 | K0 | K0 | A0 | B0 | C0 | D0 |
1 | K1 | K1 | A1 | B1 | C3 | D3 |
2 | K2 | K0 | A2 | B2 | C2 | D2 |
示例2
下面的例子演示外连接的用法:
df1 = pd.DataFrame({'A': ['a1', 'a2', 'a3'], 'B': ['b1', 'b2', 'b3'], 'Key': ['K1', 'K2', 'K3']})
df2 = pd.DataFrame({'C': ['c1', 'c2', 'c3'], 'D': ['d1', 'd2', 'd3'], 'Key': ['K1', 'K2', 'K4']})
result = pd.merge(df1, df2, on='Key', how='outer')
print(result)
输出结果如下:
A | B | Key | C | D | |
---|---|---|---|---|---|
0 | a1 | b1 | K1 | c1 | d1 |
1 | a2 | b2 | K2 | c2 | d2 |
2 | a3 | b3 | K3 | nan | nan |
3 | nan | nan | K4 | c3 | d3 |
join方法
join方法是直接在行索引上进行连接,这就要涉及到了缺失值的问题——一些表中有的数据另外一些表中没有,这样在对数据进行join的时候就需要处理好缺失值的情况。
pd.DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
其中,on参数指定的是连接列;how参数指定连接方式,有left、right、outer、inner四种类型,这与merge的参数含义一致;lsuffix和rsuffix分别是左右表中具有相同列名的列的后缀。
示例1
下面的例子演示如何在dataframe之间进行连接:
import pandas as pd
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
result = df1.join(df2.set_index('key'), on='key')
print(result)
输出结果如下:
key | A | B | C | D | |
---|---|---|---|---|---|
0 | K0 | A0 | B0 | C0 | D0 |
1 | K1 | A1 | B1 | C1 | D1 |
2 | K2 | A2 | B2 | C2 | D2 |
3 | K3 | A3 | B3 | C3 | D3 |
concat方法
concat方法可以将多个dataframe进行合并。其函数定义为:
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None,
verify_integrity=False, sort=False, copy=True)
其中,objs为需要合并的DataFrame的序列或字典,axis为合并的方向,0表示竖直方向(行),1表示水平方向(列),join为连接方式,有inner和outer两种。
示例1
下面的例子演示如何在竖直方向上合并两个dataframe:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
result = pd.concat([df1, df2], axis=0)
print(result)
输出结果如下:
A | B | C | D | |
---|---|---|---|---|
0 | A0 | B0 | C0 | D0 |
1 | A1 | B1 | C1 | D1 |
2 | A2 | B2 | C2 | D2 |
3 | A3 | B3 | C3 | D3 |
0 | A4 | B4 | C4 | D4 |
1 | A5 | B5 | C5 | D5 |
2 | A6 | B6 | C6 | D6 |
3 | A7 | B7 | C7 | D7 |
示例2
下面的例子演示如何在水平方向上合并多个dataframe:
import pandas as pd
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']})
result = pd.concat([df1, df2, df3], axis=1)
print(result)
输出结果如下:
A | B | C | D | A | B | C | D | A | B | C | D | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0 | B0 | C0 | D0 | A4 | B4 | C4 | D4 | A8 | B8 | C8 | D8 |
1 | A1 | B1 | C1 | D1 | A5 | B5 | C5 | D5 | A9 | B9 | C9 | D9 |
2 | A2 | B2 | C2 | D2 | A6 | B6 | C6 | D6 | A10 | B10 | C10 | D10 |
3 | A3 | B3 | C3 | D3 | A7 | B7 | C7 | D7 | A11 | B11 | C11 | D11 |
append方法
append方法是在dataframe的尾部添加新的行,其函数定义为:
pd.DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=None)
其中,other为新的dataframe,ignore_index为True时,新dataframe的索引会被重新编号。
示例1
下面的例子演示如何在dataframe的尾部添加新的行:
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
result = df1.append(df2)
print(result)
输出结果如下:
A | B | C | D | |
---|---|---|---|---|
0 | A0 | B0 | C0 | D0 |
1 | A1 | B1 | C1 | D1 |
2 | A2 | B2 | C2 | D2 |
3 | A3 | B3 | C3 | D3 |
0 | A4 | B4 | C4 | D4 |
1 | A5 | B5 | C5 | D5 |
2 | A6 | B6 | C6 | D6 |
3 | A7 | B7 | C7 | D7 |
总结
- merge方法可以基于列进行连接,join方法可以基于索引进行连接;
- join方法的连接方式是inner、outer、left、right,与merge方法保持一致;
- concat方法可以在水平和竖直方向上拼接多个dataframe,append方法只能在尾部添加新的行;
- join方法和merge方法对于缺失值的处理方式是不同的,需要根据具体情况进行选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pandas常用表连接merge/concat/join/append详解 - Python技术站