pandas join知识点总结。
- 创建两个dataframe
df1 = pd.DataFrame({'A': [3, 4, 8, 9], 'B': [1.2, 2.4, 4.5, 7.3], 'C': ["aa", "bb", "cc", "dd"]})
df2 = pd.DataFrame({'D': [1, 2]})
结果如下:
A B C
0 3 1.2 aa
1 4 2.4 bb
2 8 4.5 cc
3 9 7.3 dd
D
0 1
1 2
- 所有参数默认
默认情况下,采用左连接的方式按照索引进行连接
result = df1.join(df2)
结果如下:
A B C D
0 3 1.2 aa 1.0
1 4 2.4 bb 2.0
2 8 4.5 cc NaN
3 9 7.3 dd NaN
- 左连接
result = df1.join(df2, how='left')
结果如下:
A B C D
0 3 1.2 aa 1.0
1 4 2.4 bb 2.0
2 8 4.5 cc NaN
3 9 7.3 dd NaN
- 右连接
result = df1.join(df2, how='right')
结果如下:
A B C D
0 3 1.2 aa 1
1 4 2.4 bb 2
- 内连接
result = df1.join(df2, how='inner')
结果如下:
A B C D
0 3 1.2 aa 1
1 4 2.4 bb 2
- 全连接
result = df1.join(df2, how='outer')
结果如下:
A B C D
0 3 1.2 aa 1.0
1 4 2.4 bb 2.0
2 8 4.5 cc NaN
3 9 7.3 dd NaN
-
join是按照索引进行连接,在实际应用中,常常采用set_index()临时设置索引,假设有df3
C D
0 bb 1
1 dd 2
此时,df1和df3有共同的列名C,如果直接对df1和df3按照索引进行合并会报错
ValueError: columns overlap but no suffix specified: Index(['C'], dtype='object')
这是因为两个dataframe在合并时候有相同的列名,需要使用属性lsuffix和rsuffix指定相同列名的后缀,示例如下:
result = df1.join(df3, lsuffix='_l', rsuffix='_r')
结果如下:
A B C_l C_r D
0 3 1.2 aa bb 1.0
1 4 2.4 bb dd 2.0
2 8 4.5 cc NaN NaN
3 9 7.3 dd NaN NaN
按照相同列合并
-
左连接
result = df1.set_index("C").join(df3.set_index("C"), on="C", how="left")
结果如下:
A B D
C
aa 3 1.2 NaN
bb 4 2.4 1.0
cc 8 4.5 NaN
dd 9 7.3 2.0
- 右连接
result = df1.set_index("C").join(df3.set_index("C"), on="C", how="right")
结果如下:
A B D
C
bb 4 2.4 1
dd 9 7.3 2
- 内连接
result = df1.set_index("C").join(df3.set_index("C"), on="C", how="inner")
结果如下:
A B D
C
bb 4 2.4 1
dd 9 7.3 2
- 外连接
result = df1.set_index("C").join(df3.set_index("C"), on="C", how="outer")
结果如下:
A B D
C
aa 3 1.2 NaN
bb 4 2.4 1.0
cc 8 4.5 NaN
dd 9 7.3 2.0
这种方式采用了set_index(),join完之后一般还需要恢复之前的索引,方法如下:
df1.reset_index(inplace=True)
df3.reset_index(inplace=True)
# 或者
df1 = df1.reset_index()
df3 = df3.reset_index()
jp_666 发布了80 篇原创文章 · 获赞 45 · 访问量 22万+ 私信 关注