python 合并数据集_数据规整化:python 合并数据集

Pandas和python标准库提供了一组高级的、灵活的、高效的核心函数和算法,它们使你能够轻松地将数据规整化为正确的形式。

1.合并数据集

pandas对象中的数据可以通过一些内置的方式进行合并:

n pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该比较熟悉,应为它实现的就是数据库连接操作。

n pandas.concat可以沿着一条轴将多个对象堆叠到一起。

n 实例方法combine_first可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。

1.1 数据库风格的DataFrame合并

数据集的合并(merge)或连接(join)运算是通过一个或多个键将行链接起来的。

In [17]: df1=DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})

In [18]: df2=DataFrame({'key':['a','b','d'],'data2':range(3)})

In [19]: df1

Out[19]:

data1 key

0 0 b

1 1 b

2 2 a

3 3 c

4 4 a

5 5 a

6 6 b

In [20]: df2

Out[20]:

data2 key

0 0 a

1 1 b

2 2 d

1.1.1 合并:pd.merge()

#有公共键情况

In [21]: pd.merge(df1,df2)

Out[21]:

data1 key data2

0 0 b 1

1 1 b 1

2 6 b 1

3 2 a 0

4 4 a 0

5 5 a 0

注意:上述并没有指明要用哪个列进行连接。如果没有指定,merge就回将重叠的列名当做键。(最好显示一下)

1.1.2 指定合并键:on

#有公共键情况

In [22]: pd.merge(df1,df2,on='key')

Out[22]:

data1 key data2

0 0 b 1

1 1 b 1

2 6 b 1

3 2 a 0

4 4 a 0

5 5 a 0

1.1.3 合并:列名不同

In [23]: df3=DataFrame({'1key':['b','b','a','c','a','a','b'],'data1':range(7)})

In [24]: df4=DataFrame({'2key':['a','b','d'],'data2':range(3)})

In [25]: pd.merge(df3,df4,left_on='1key',right_on='2key')

Out[25]:

1key data1 2key data2

0 b 0 b 1

1 b 1 b 1

2 b 6 b 1

3 a 2 a 0

4 a 4 a 0

5 a 5 a 0

默认情况下,merge做的是“inner”连接;结果中的键是交集。其他方式还有“left”、“right”以及“outer”。外连接求取的是键的并集,组合了左连接和右连接的效果。

1.1.4 外连接:how=’outer’

外连接求取的是键的并集,组合了左连接和右连接的效果。

In [33]: pd.merge(df1,df2,on='key',how='outer')

Out[33]:

data1 key data2

0 0.0 b 1.0

1 1.0 b 1.0

2 6.0 b 1.0

3 2.0 a 0.0

4 4.0 a 0.0

5 5.0 a 0.0

6 3.0 c NaN

7 NaN d 2.0

1.1.5 左连接:how=’left’

LPT标记:指定左键,会以左边为主。左边展示全部,右边只展示与左边公共部分;若左边有,右边没有,则右边为NAN。左边没有,右边有,则不展示。

In [34]: df1=DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})

In [35]: df2=DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})

In [36]: pd.merge(df1,df2,on='key',how='left')

Out[36]:

data1 key data2

0 0 b 1.0

1 0 b 3.0

2 1 b 1.0

3 1 b 3.0

4 2 a 0.0

5 2 a 2.0

6 3 c NaN

7 4 a 0.0

8 4 a 2.0

9 5 b 1.0

10 5 b 3.0

多对多连接产生的是行的笛卡尔积。由于左边的DataFrame有3个“b”行,右边的有2个,所以最终结果中就有6个“b”行。连接方式只影响出现在结果中的键:

1.1.6 内连接:how=’inner’

#内连接取的是交集

In [37]: pd.merge(df1,df2,how='inner')

Out[37]:

data1 key data2

0 0 b 1

1 0 b 3

2 1 b 1

3 1 b 3

4 5 b 1

5 5 b 3

6 2 a 0

7 2 a 2

8 4 a 0

9 4 a 2

1.1.7 按多个键合并

要根据多个键进行合并,传入一个由列名组成的列表即可:

In [38]: left=DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'1val':[1,2,3]})

In [39]: right=DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','two','one','two'],'1val':[4,5,6,7]})

In [40]: pd.merge(left,right,on=['key1','key2'],how='outer')

Out[40]:

1val_x key1 key2 1val_y

0 1.0 foo one 4

1 2.0 foo two 5

2 3.0 bar one 6

3 NaN bar two 7

「亲,如果笔记对您有帮助,收藏的同时,记得给点个赞、加个关注哦!感谢!」

「文中代码均亲测过,若有错误之处,欢迎批评指正,一起学习,一起成长!」

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值