Python多表查询

本文主要介绍了Python中常用的多表查询操作,包括:纵向追加、横向合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#全部行都能输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

import numpy as np
import pandas as pd

np.random.seed(666)
a = np.random.randint(60, 100, (5, 3))
df1 = pd.DataFrame(a,
index=['A1', 'A2', 'A3', 'A4', 'A5'],
columns=['语文', '数学', '英语'])
b = np.random.randint(60, 100, (3, 4))
df2 = pd.DataFrame(b,
index=['A6', 'A7', 'A8'],
columns=['物理', '数学', '英语', '语文'])
c = np.random.randint(60, 100, (3, 2))
df3 = pd.DataFrame(c,
index=['A2', 'A3', 'A9'],
columns=['物理', '化学'])

print(df1)
print(df2)
print(df3)
    语文  数学  英语
A1  62  90  66
A2  69  90  96
A3  87  90  91
A4  88  74  93
A5  76  99  65
    物理  数学  英语  语文
A6  78  72  75  73
A7  65  80  71  84
A8  80  96  96  90
    物理  化学
A2  76  73
A3  96  86
A9  65  99

1、纵向追加

pd.concat([df1, df2,df3..], axis=0, join='outer',keys)

  • axis=0 默认是纵向拼接 , axis=1横向拼接。
  • join默认连接方式是外连接, 当然还有inner内连接。注意这里没有左连接和右连接。
  • 设置keys用于区分合并后的数据来自于哪个表

1.1、纵向外连接

  • axis=0代表纵向, 会按照相同的列名进行拼接。
  • join=’outer’表示外连接, 外连接会保留所有的信息, 匹配不上的地方就是缺失值。
1
2
df = pd.concat([df1, df2], axis=0,join='outer', keys=['df1','df2'])
print(df)
        语文  数学  英语    物理
df1 A1  62  90  66   NaN
    A2  69  90  96   NaN
    A3  87  90  91   NaN
    A4  88  74  93   NaN
    A5  76  99  65   NaN
df2 A6  73  72  75  78.0
    A7  84  80  71  65.0
    A8  90  96  96  80.0

1.2、纵向内连接

  • axis=0
  • 内连接是保留匹配上的数据, 纵向连接的时候, 是以列来匹配的, 即保留大家都有的列
1
2
df = pd.concat([df1, df2], axis=0,join='inner', keys=['df1','df2'])
print(df)
        语文  数学  英语
df1 A1  62  90  66
    A2  69  90  96
    A3  87  90  91
    A4  88  74  93
    A5  76  99  65
df2 A6  73  72  75
    A7  84  80  71
    A8  90  96  96

2、横向合并

2.1、pd.concat()

pd.concat([df1, df2,df3..], axis=0, join='outer',keys)

  • axis=0 默认是纵向拼接 , axis=1横向拼接。
  • join默认连接方式是外连接, 当然还有inner内连接。注意这里没有左连接和右连接。
  • 设置keys用于区分合并后的数据来自于哪个表

注意:只能通过索引进行关联!

2.11、横向外连接

  • axis=1
  • 外连接保留两张表所有的信息
1
2
df = pd.concat([df1, df2], axis=1, join='outer', keys=['df1','df2'])  # 保留所有的信息
print(df)
     df1               df2                  
      语文    数学    英语    物理    数学    英语    语文
A1  62.0  90.0  66.0   NaN   NaN   NaN   NaN
A2  69.0  90.0  96.0   NaN   NaN   NaN   NaN
A3  87.0  90.0  91.0   NaN   NaN   NaN   NaN
A4  88.0  74.0  93.0   NaN   NaN   NaN   NaN
A5  76.0  99.0  65.0   NaN   NaN   NaN   NaN
A6   NaN   NaN   NaN  78.0  72.0  75.0  73.0
A7   NaN   NaN   NaN  65.0  80.0  71.0  84.0
A8   NaN   NaN   NaN  80.0  96.0  96.0  90.0

2.12、横向内连接

  • axis=1
  • join=’inner’, 好留两张表都有的行索引
1
2
df = pd.concat([df1, df3], axis=1, join='inner', keys=['df1','df3'])
print(df)
   df1         df3    
    语文  数学  英语  物理  化学
A2  69  90  96  76  73
A3  87  90  91  96  86

2.2、pd.merge()

pd.merge(左表, 右表,how=连接方式, on=连接字段 )

  • pd.merge()基本参照的是数据库表的连接方式, 也是用的最多的连接方式, 逻辑上与数据库保持一致。
  • how=’inner’, 即默认是内连接, 这里还可以选择外连接outer 左连接left 右连接right
1
2
3
4
5
6
df1 = df1.reset_index().rename(columns={'index':'姓名'})
df2 = df2.reset_index().rename(columns = {'index':'姓名'})
df3 = df3.reset_index().rename(columns = {'index':'姓名'})
print(df1)
print(df2)
print(df3)
   姓名  语文  数学  英语
0  A1  62  90  66
1  A2  69  90  96
2  A3  87  90  91
3  A4  88  74  93
4  A5  76  99  65
   姓名  物理  数学  英语  语文
0  A6  78  72  75  73
1  A7  65  80  71  84
2  A8  80  96  96  90
   姓名  物理  化学
0  A2  76  73
1  A3  96  86
2  A9  65  99

2.21、内连接

  • how=’inner’
  • 保留在连接字段上大家都有的
1
2
df = pd.merge(df1, df3, 'inner', '姓名')
print(df)
   姓名  语文  数学  英语  物理  化学
0  A2  69  90  96  76  73
1  A3  87  90  91  96  86

2.22、外连接

  • how=’outer’
  • 全部所有的信息
1
2
df = pd.merge(df1, df2, how='outer', on='姓名')
print(df)
   姓名  语文_x  数学_x  英语_x    物理  数学_y  英语_y  语文_y
0  A1  62.0  90.0  66.0   NaN   NaN   NaN   NaN
1  A2  69.0  90.0  96.0   NaN   NaN   NaN   NaN
2  A3  87.0  90.0  91.0   NaN   NaN   NaN   NaN
3  A4  88.0  74.0  93.0   NaN   NaN   NaN   NaN
4  A5  76.0  99.0  65.0   NaN   NaN   NaN   NaN
5  A6   NaN   NaN   NaN  78.0  72.0  75.0  73.0
6  A7   NaN   NaN   NaN  65.0  80.0  71.0  84.0
7  A8   NaN   NaN   NaN  80.0  96.0  96.0  90.0
1
2
df = pd.merge(df1, df3, how='outer', on='姓名')
print(df)
   姓名    语文    数学    英语    物理    化学
0  A1  62.0  90.0  66.0   NaN   NaN
1  A2  69.0  90.0  96.0  76.0  73.0
2  A3  87.0  90.0  91.0  96.0  86.0
3  A4  88.0  74.0  93.0   NaN   NaN
4  A5  76.0  99.0  65.0   NaN   NaN
5  A9   NaN   NaN   NaN  65.0  99.0

2.23、左连接

  • how=’left’
  • 保留左表所有的信息
1
2
df = pd.merge(df3, df1, how='left', on='姓名')
print(df)
   姓名  物理  化学    语文    数学    英语
0  A2  76  73  69.0  90.0  96.0
1  A3  96  86  87.0  90.0  91.0
2  A9  65  99   NaN   NaN   NaN

2.24、右连接

  • how = ‘right’
  • 保留右表所有的信息
1
2
df = pd.merge(df1, df3, 'right', '姓名')
print(df)
   姓名    语文    数学    英语  物理  化学
0  A2  69.0  90.0  96.0  76  73
1  A3  87.0  90.0  91.0  96  86
2  A9   NaN   NaN   NaN  65  99

总结:

纵向追加用pd.concat()
横向合并使用索引关联用pd.concat(),使用字段关联用pd.merge()

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2022-2024 归一
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信