merge算是关系数据库用得很多的一个操作,所以单独开一篇细讲这个函数。
!cd
E:\ML\实战\pandas实用教程
import numpy as np
import pandas as pd
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort = False)
¶concat函数本质上是在所有索引上同时进行对齐合并,而如果想在任意列上对齐合并,则需要merge函数,其在sql应用很多。
df1 = pd.DataFrame([[1,2],[3,4]], index = ['a','b'],columns = ['A','B'])
df2 = pd.DataFrame([[1,3],[4,8]], index = ['b','d'],columns = ['B','C'])
df1
A | B | |
---|---|---|
a | 1 | 2 |
b | 3 | 4 |
df2
B | C | |
---|---|---|
b | 1 | 3 |
d | 4 | 8 |
pd.merge(left = df1, right = df2, how = 'inner' ,left_index = True, right_index = True)
A | B_x | B_y | C | |
---|---|---|---|---|
b | 3 | 4 | 1 | 3 |
# 小区别是concat对重复列没有重命名,但是重名的情况不多,而且重名了说明之前设计就不大合理。
pd.concat([df1,df2], join = 'inner',axis =1)
A | B | B | C | |
---|---|---|---|---|
b | 3 | 4 | 1 | 3 |
#对于'B'列:df1的'b'行、df2的'd'行,是相同的,其他都不同。
pd.merge(left = df1, right = df2, how = 'inner' , on =['B'])
A | B | C | |
---|---|---|---|
0 | 3 | 4 | 8 |
# df1的'A'列'b'行,df2的'C'列'd'行是相同的,其他都不同。
# 其他列如果同名会进行重命名。
pd.merge(left = df1, right = df2, how = 'inner',left_on = ['A'] ,right_on = ['C'])
A | B_x | B_y | C | |
---|---|---|---|---|
0 | 3 | 4 | 1 | 3 |
how
用法¶# 保持左侧DataFrame不变,用右侧来跟它对齐,对不上的填NaN。
pd.merge(left = df1, right = df2, how = 'left', on = ['B'] )
A | B | C | |
---|---|---|---|
0 | 1 | 2 | NaN |
1 | 3 | 4 | 8.0 |
# 保持右侧DataFrame不变,用右侧来跟它对齐,对不上的填NaN。
pd.merge(left = df1, right = df2, how = 'right', on = ['B'] )
A | B | C | |
---|---|---|---|
0 | 3.0 | 4 | 8 |
1 | NaN | 1 | 3 |
重复的也没关系,操作逻辑是一致的,完全可以假想不存在重复。
df1.loc['a','B'] =4 #改成重复
df1
A | B | |
---|---|---|
a | 1 | 4 |
b | 3 | 4 |
### 保持右侧的列都在,如果左侧对齐的列存在重复值,那么对齐上后也存在重复。
pd.merge(left = df1, right = df2, how = 'right', on = ['B'] )
A | B | C | |
---|---|---|---|
0 | 1.0 | 4 | 8 |
1 | 3.0 | 4 | 8 |
2 | NaN | 1 | 3 |