You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.4 KiB
4.4 KiB
3.2.4:合并与连接
相关知识
merge()
可根据一个或者多个键将不同的DataFrame
连接在一起,类似于SQL
数据库中的合并操作。
参数名 | 说明 |
---|---|
left | 拼接左侧DataFrame对象 |
right | 拼接右侧DataFrame对象 |
on | 列(名称)连接,必须在左和右DataFrame对象中存在(找到)。 |
left_on | 左侧DataFrame中的列或索引级别用作键,可以是列名、索引级名,也可以是长度等于DataFrame长度的数组。 |
right_on | 右侧DataFrame中的列或索引级别用作键。可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。 |
left_index | 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 |
right_index | 与left_index相似 |
how | 它可以等于left, right, outer, inner. 默认inner。inner是取交集,outer取并集。 |
sort | 按照字典顺序通过连接键对结果DataFrame进行排序。 |
suffixes | 用于追加到重叠列名的末尾。例如,左右两个DataFrame都有data列,则结果中就会出现data_x和data_y. |
copy | 默认总是复制 |
数据连接的类型
- 一对一的连接
df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'], 'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'], 'hire_date': [2004, 2008, 2012, 2014]})
df3 = pd.merge(df1,df2)
df3
输出:
- 多对一的连接
df4 = pd.DataFrame({'group': ['Accounting', 'Engineering', 'HR'], 'supervisor': ['Carly', 'Guido', 'Steve']})
pd.merge(df3,df4)
输出:
- 多对多连接
df5 = pd.DataFrame({'group': ['Accounting', 'Accounting', 'Engineering', 'Engineering', 'HR', 'HR'], 'skills': ['math', 'spreadsheets', 'coding', 'linux', 'spreadsheets', 'organization']})
pd.merge(df1,df5)
输出:
merge()的主要参数
1. on
可以是列名字符串或者一个包含多列名称的列表
pd.merge(df1, df2, on='employee')
输出:
这个参数只能在两个DataFrame
有共同列名的时候才可以使用。
2. left_on
与right_on
参数
有时你也需要合并两个列名不同的数据集,例如前面的员工信息表中有一个字段不是employee
而是name
。在这种情况下,就可以用left_on
和right_on
参数来指定列名。
df3 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'salary': [70000, 80000, 120000, 90000]})
dfx = pd.merge(df1,df3,left_on="employee",right_on="name")
输出:
如果出现重复列,但是列名不同时,可以使用drop
方法将这列去掉
dfx.drop("name",axis=1)
输出:
3. left_index与right_index参数 用于合并索引
df1a = df1.set_index('employee')
df2a = df2.set_index('employee')
pd.merge(df1a,df2a,left_index=True,right_index=True)
输出:
用join()
方法也可以实现该功能:
df1a.join(df2a)
输出:
如果想将索引与列混合使用,那么可以通过结合left_index
与 right_on
,或者结合left_on
与right_index
来实现。
pd.merge(df1a, df3, left_index=True, right_on='name')
输出:
4. how参数
how
参数默认情况下是inner
,也就是取交集。how
参数支持的数据连接方式还有outer
、left
和right
。outer
表示外连接,取并集。
df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'], 'food': ['fish', 'beans', 'bread']}, columns=['name', 'food'])
df7 = pd.DataFrame({'name': ['Mary', 'Joseph'], 'drink': ['wine', 'beer']}, columns=['name', 'drink'])
pd.merge(df6, df7, how='outer')
输出:
左连接和右连接返回的结果分别只包含左列和右列。
pd.merge(df6, df7, how='left')
输出:
5. suffixes参数
如果输出结果中有两个重复的列名,因此pd.merge()
函数会自动为它们增加后缀 _x
或 _y
,当然也可以通过suffixes
参数自定义后缀名。
df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [1, 2, 3, 4]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [3, 1, 4, 2]})
pd.merge(df8, df9, on="name", suffixes=["_L", "_R"])
输出:
suffixes
参数同样适用于任何连接方式,即使有三个及三个以上的重复列名时也同样适用。