微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

 

jp_666 发布了80 篇原创文章 · 获赞 45 · 访问量 22万+ 私信 关注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐