pandas merge相关知识点总结。
- 创建两个dataframe
df1
结果如下:
A B C
0 3 1.2 aa
1 4 2.4 bb
2 8 4.5 cc
3 9 7.3 dd
B C D
0 1.2 ab 1
1 2.2 bb 2
2 4.3 cc 3
3 7.3 dd 4
- 直接合并,采用默认的连接方式。默认采用inner连接方式,按照列名相同的列进行合并
result = pd.merge(df1, df2)
结果如下:
A B C D
0 9 7.3 dd 4
- 指定on参数,以特定的列进行合并
on参数用于指定合并的基准列,按照设置的列名称进行合并,两个dataframe中除了on参数指定的列之外列名相同的列会变换名称后保留下来
result = pd.merge(df1, df2, on='B')
结果如下:
A B C_x C_y D
0 3 1.2 aa ab 1
1 9 7.3 dd dd 4
- how属性,指定连接方式
# innner: 默认的连接方式,共同的列必须完全相等
result = pd.merge(df1, df2, on='B', how='inner')
结果如下:
A B C_x C_y D
0 3 1.2 aa ab 1
1 9 7.3 dd dd 4
# outer: 共同列的值都会保留,两个dataframe在共同列上的差集,会对它们的缺失列项的值赋上NaN
result = pd.merge(df1, df2, on='B', how='outer')
结果如下:
A B C_x C_y D
0 3.0 1.2 aa ab 1.0
1 4.0 2.4 bb NaN NaN
2 8.0 4.5 cc NaN NaN
3 9.0 7.3 dd dd 4.0
4 NaN 2.2 NaN bb 2.0
5 NaN 4.3 NaN cc 3.0
# left: 根据左边的dataframe确定共同列的保留值,右边缺失列的值赋为NaN
result = pd.merge(df1, df2, on='B', how='left')
结果如下:
A B C_x C_y D
0 3 1.2 aa ab 1.0
1 4 2.4 bb NaN NaN
2 8 4.5 cc NaN NaN
3 9 7.3 dd dd 4.0
# right: 根据右边的dataframe确定共同列的保留值,左边缺失列的值赋为NaN
result = pd.merge(df1, df2, on='B', how='right')
结果如下:
A B C_x C_y D
0 3.0 1.2 aa ab 1
1 9.0 7.3 dd dd 4
2 NaN 2.2 NaN bb 2
3 NaN 4.3 NaN cc 3
- 多列合并
result = pd.merge(df1, df2, on=['B', 'C'], how='inner')
结果如下:
A B C D
0 9 7.3 dd 4
- left_on 和 right_on
采用left_on 和 right_on对两个列名不同的dataframe合并
result = pd.merge(df1, df2, left_on='A', right_on='D', how='inner')
结果如下:
A B_x C_x B_y C_y D
0 3 1.2 aa 4.3 cc 3
1 4 2.4 bb 7.3 dd 4
- 索引连接
采用left_index=True或者right_index=True使一个dataframe与另一个dataframe按照索引和列合并
如:df1的索引与df2的D列相同时合并
result = pd.merge(df1, df2, left_index=True, right_on='D')
结果如下:
A B_x C_x B_y C_y D
0 4 2.4 bb 1.2 ab 1
1 8 4.5 cc 2.2 bb 2
2 9 7.3 dd 4.3 cc 3
- 相同的列重命名
采用suffixes属性为合并的两个dataframe的相同的列设置合并后相同列名的后缀
result = pd.merge(df1, df2, on='B', how='outer', suffixes=('_df1', '_df2'))
结果如下:
A B C_df1 C_df2 D
0 3.0 1.2 aa ab 1.0
1 4.0 2.4 bb NaN NaN
2 8.0 4.5 cc NaN NaN
3 9.0 7.3 dd dd 4.0
4 NaN 2.2 NaN bb 2.0
5 NaN 4.3 NaN cc 3.0
参考:
https://www.cnblogs.com/guxh/p/9451532.html
https://blog.csdn.net/Asher117/article/details/84725199