pandas入门: 数据合并之--join

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()

pandas入门: 数据合并之--join

 

pandas入门: 数据合并之--joinpandas入门: 数据合并之--join jp_666 发布了80 篇原创文章 · 获赞 45 · 访问量 22万+ 私信 关注
上一篇:pandas 合并操作 append处理重复项


下一篇:关于pandas增加行时,索引名称的一些问题