前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas系列4_合并和连接

pandas系列4_合并和连接

作者头像
皮大大
发布2021-03-02 15:01:28
7660
发布2021-03-02 15:01:28
举报
文章被收录于专栏:机器学习/数据可视化

concat函数

直接将值和索引粘合在一起,默认是在axis=0上面工作,得到的是新的Series;改成axis=1,变成一个DF型数据

  • axis
    • axis=0:默认是Series
    • axis=1:得到DF数据,缺值用NaN补充
  • join
    • outer:合并,缺值用nan
    • inner:求交集,非交集部分直接删除
  • keys:用于层次化索引
  • ignore_index:不保留连接轴上的索引,产生新的索引

官方文档

代码语言:javascript
复制
import pandas as pd
import numpy as np
代码语言:javascript
复制
s1 = pd.Series([0,1], index=['a','b'])
代码语言:javascript
复制
s2 = pd.Series([2,3,4], index=['c','d','e'])
代码语言:javascript
复制
s3 = pd.Series([5, 6], index=['f', 'g'])
代码语言:javascript
复制
# 默认是得到S型数据
pd.concat([s1, s2])
代码语言:javascript
复制
a    0
b    1
c    2
d    3
e    4
dtype: int64
代码语言:javascript
复制
# 转成DF型数据:axis=1
pd.concat([s1, s2], axis=1, sort=True)

0

1

a

0.0

NaN

b

1.0

NaN

c

NaN

2.0

d

NaN

3.0

e

NaN

4.0

代码语言:javascript
复制
pd.concat([s1,s2,s3], axis=1,sort=True)

0

1

2

a

0.0

NaN

NaN

b

1.0

NaN

NaN

c

NaN

2.0

NaN

d

NaN

3.0

NaN

e

NaN

4.0

NaN

f

NaN

NaN

5.0

g

NaN

NaN

6.0

代码语言:javascript
复制
s4 = pd.concat([s1, s3])
s4
代码语言:javascript
复制
a    0
b    1
f    5
g    6
dtype: int64
代码语言:javascript
复制
# join='inner':交集;join='outer':并集
pd.concat([s1,s4], axis=1, sort=True, join='inner')

0

1

a

0

0

b

1

1

代码语言:javascript
复制
pd.concat([s1,s4],axis=1,join_axes=[['a','c','b','e']])

0

1

a

0.0

0.0

c

NaN

NaN

b

1.0

1.0

e

NaN

NaN

代码语言:javascript
复制
# keys参数生成层次化索引
result = pd.concat([s1,s1,s3],keys=['one','two','three'])
result
代码语言:javascript
复制
one    a    0
       b    1
two    a    0
       b    1
three  f    5
       g    6
dtype: int64
代码语言:javascript
复制
result.unstack()

a

b

f

g

one

0.0

1.0

NaN

NaN

two

0.0

1.0

NaN

NaN

three

NaN

NaN

5.0

6.0

代码语言:javascript
复制
# 沿着axis=1合并,keys成为DF的列头
pd.concat([s1,s2,s3], axis=1, sort=True, keys=['one','two','three'])

one

two

three

a

0.0

NaN

NaN

b

1.0

NaN

NaN

c

NaN

2.0

NaN

d

NaN

3.0

NaN

e

NaN

4.0

NaN

f

NaN

NaN

5.0

g

NaN

NaN

6.0

merge函数

可根据⼀个或多个键将不同DataFrame中的⾏连接起来,它实现的就是数据库的join操作 ,就是数据库风格的合并

常用参数表格

参数

说明

left

参与合并的左侧DF

right

参与合并的右侧DF

how

默认是inner,inner、outer、right、left

on

用于连接的列名,默认是相同的列名

left_on \right_on

左侧、右侧DF中用作连接键的列

sort

根据连接键对合并后的数据进行排序,默认是T

suffixes

重复列名,直接指定后缀,用元组的形式(’_left’, ‘_right’)

left_index、right_index

将左侧、右侧的行索引index作为连接键(用于index的合并)

代码语言:javascript
复制
df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a','c'], 
                    'data1': range(7)})
df1

key

data1

0

b

0

1

b

1

2

a

2

3

c

3

4

a

4

5

a

5

6

c

6

代码语言:javascript
复制
df2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                    'data2': range(3)})
df2

key

data2

0

a

0

1

b

1

2

d

2

两个DF有相同的列属性怎么处理
  • 如果不指定on参数,自动按照重叠的列名进行合并
  • 最好指定key pd.merge(df1, df2, on='key')
代码语言:javascript
复制
# 将两个df数据中相同的值进行合并
pd.merge(df1, df2)

key

data1

data2

0

b

0

1

1

b

1

1

2

a

2

0

3

a

4

0

4

a

5

0

两个DF没有相同的列属性怎么处理
  • 若没有相同的列属性,需要指定left_onright_on
  • pd.merge(df3,df4,left_on='lkey',right_on='rkey')
代码语言:javascript
复制
df3 = pd.DataFrame({'lkey': ['b', 'b', 'a', 'c', 'a', 'a','c'], 
                    'data1': range(7)})
df3

lkey

data1

0

b

0

1

b

1

2

a

2

3

c

3

4

a

4

5

a

5

6

c

6

代码语言:javascript
复制
df4 = pd.DataFrame({'rkey': ['a', 'b', 'd'],
                    'data2': range(3)})
df4

rkey

data2

0

a

0

1

b

1

2

d

2

代码语言:javascript
复制
pd.merge(df3,df4,left_on='lkey',right_on='rkey')  # 相同的列属性指定新生成的df数据中的新列名

lkey

data1

rkey

data2

0

b

0

b

1

1

b

1

b

1

2

a

2

a

0

3

a

4

a

0

4

a

5

a

0

交集和并集

通过参数how来实现,参数表格

选项

说明

inner

两个表中公有的键

outer

两个表中所有的键,不存在的值用NaN补足

left

左表中所有的键

right

右表中所有的键

  • 交集:how=inner,默认取值,内连接
  • 并集:how=outer,外连接
代码语言:javascript
复制
pd.merge(df1, df2, how="outer")  # 外键求并集,默认是inner求交集

key

data1

data2

0

b

0.0

1.0

1

b

1.0

1.0

2

a

2.0

0.0

3

a

4.0

0.0

4

a

5.0

0.0

5

c

3.0

NaN

6

c

6.0

NaN

7

d

NaN

2.0

重复列名处理
代码语言:javascript
复制
left = pd.DataFrame({'key1': ['foo', 'foo', 'bar'],
                    'key2': ['one', 'two', 'one'],
                     'lval': [1, 2, 3]})
代码语言:javascript
复制
right = pd.DataFrame({'key1': ['foo', 'foo', 'bar', 'bar'],
                      'key2': ['one', 'one', 'one', 'two'],
                      'rval': [4, 5, 6, 7]})
代码语言:javascript
复制
pd.merge(left, right, on=["key1", "key2"], how="outer")  # 使用相同的列名key1和key2

key1

key2

lval

rval

0

foo

one

1.0

4.0

1

foo

one

1.0

5.0

2

foo

two

2.0

NaN

3

bar

one

3.0

6.0

4

bar

two

NaN

7.0

代码语言:javascript
复制
pd.merge(left, right, on='key1')   # 通过key1进行连接,key2重复了,默认是在key2的后面添加_x、_y

key1

key2_x

lval

key2_y

rval

0

foo

one

1

one

4

1

foo

one

1

one

5

2

foo

two

2

one

4

3

foo

two

2

one

5

4

bar

one

3

one

6

5

bar

one

3

two

7

代码语言:javascript
复制
pd.merge(left, right, on='key1',suffixes=('_left', '_right'))  # 指定后缀连接符

key1

key2_left

lval

key2_right

rval

0

foo

one

1

one

4

1

foo

one

1

one

5

2

foo

two

2

one

4

3

foo

two

2

one

5

4

bar

one

3

one

6

5

bar

one

3

two

7

行索引的合并
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-8,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • concat函数
  • merge函数
    • 两个DF有相同的列属性怎么处理
      • 两个DF没有相同的列属性怎么处理
        • 交集和并集
          • 重复列名处理
            • 行索引的合并
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档