pandas(09 合并/连接和连接join)

前面内容:pandas(08 缺失数据和分组) 

目录

一、Python Pandas 合并/连接

1.1 merge()语法 

1.2 使用 'how' 参数合并

二、Python Pandas 连接join

2.1 concat()语法 

2.2 连接对象

2.3 时间序列


 

一、Python Pandas 合并/连接

1.1 merge()语法 

Pandas提供了一个单一的函数 merge ,作为DataFrame对象之间所有标准数据库连接操作的入口点。

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
  • left − 左侧的 DataFrame。
  • right − 右侧的 DataFrame。

  • on −指定用于合并的列名(如果两个 DataFrame 中要合并的列名相同,可以使用这个参数)。如果未指定,默认为使用重叠的列作为连接键。

  • left_on − 从左侧DataFrame中用作键的列。可以是列名称或与DataFrame长度相等的数组。

  • right_on − 从右侧DataFrame中用作键的列。可以是列名称或与DataFrame长度相等的数组。

  • left_index − 如果 True, 则使用左侧DataFrame的索引(行标签)作为其连接键(则使用左侧 DataFrame 的索引进行合并)。对于具有MultiIndex(分层)的DataFrame,级数的数量必须与右侧DataFrame的连接键数量匹配。

  • right_index − 对于右侧DataFrame,与 left_index 的用法相同。

  • how: 指定合并的方式,默认为inner。常见的有:

    • inner: 内连接(只保留两个 DataFrame 中都存在的行)。
    • outer: 外连接(保留两个 DataFrame 中的所有行,缺失值填充 NaN)。
    • left: 左连接(保留左侧 DataFrame 中的所有行,右侧 DataFrame 中没有匹配的行将填充 NaN)。
    • right: 右连接(保留右侧 DataFrame 中的所有行,左侧 DataFrame 中没有匹配的行将填充 NaN)。
  • sort − 按字典顺序对连接键对应的结果DataFrame进行排序。默认为 True,表示按合并后的列进行排序。如果设置为 False,则保持原始顺序

例1:基础数据

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
   {'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print(left)
print('-'*50)
print(right)

运行结果: 

 

例2:在关键字上合并两个数据框

print(pd.merge(left,right,on='id'))

运行结果: 

 

例3:多个键合并两个数据框

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
   {'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print(pd.merge(left,right,on=['id','subject_id']))

运行结果:

1.2 使用 'how' 参数合并

merge 函数的 how 参数指定如何确定包含在合并表中的键。如果某个键的组合在左表和右表中都不存在,那么合并表中对应的值将为 NA。

下面是 how 参数选项及其 SQL 等效名称的摘要:

合并方法SQL等效描述
左(left)左外部联接使用左对象的键
右(right)右外部联接使用右对象的键
外(outer)完全外部联接使用键的联合
内(inner)内部联接使用键的交集

例4:左连接

print(pd.merge(left, right, on='subject_id', how='left'))

运行结果:

例4:右连接

print(pd.merge(left, right, on='subject_id', how='right'))

运行结果:

 

例5:外连接 

print(pd.merge(left, right, how='outer', on='subject_id'))

运行结果:

提示:left 和right 的并集就是outer 

例6:内连接 

print(pd.merge(left, right, on='subject_id', how='inner'))

运行结果:

提示:left 和right 的交集就是innter  

二、Python Pandas 连接join

2.1 concat()语法 

Pandas提供了各种方法来轻松地组合 Series, DataFrame 和 Panel 对象。

pd.concat(objs,axis=0,join='outer',join_axes=None,
ignore_index=False)
  • objs − 这是一系列或映射的Series、DataFrame或Panel对象。
  • sxis(轴) − {0, 1, ...},默认为0。这是要沿着连接的轴。

  • join − {'inner', 'outer'},默认为'outer'。如何处理其他轴上的索引。对于并集使用Outer,对于交集使用Inner。

  • ignore_index − 布尔型, 默认为 False如果为True,则不使用连接轴上的索引值。结果轴将被标记为0,…,n-1。

  • join_axes − 这是索引对象的列表。特定的索引用于其他(n-1)轴,而不执行内部/外部集合逻辑。

2.2 连接对象

concat 函数负责执行沿轴进行连接作的大部分工作。让我们创建不同的对象并进行连接操作。

例1:基础数据 

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print(pd.concat([one,two]))

运行结果: 

每个切分后的DataFrame的部分关联起来。我们可以使用 keys 参数来实现 

例2:keys

print(pd.concat([one,two],keys=['x','y']))

运行结果:

例3:ignore_index

print(pd.concat([one,two],keys=['x','y'],ignore_index=True))

运行结果:

 

例4:axis

print(pd.concat([one,two],axis=1))

运行结果:  

2.3 时间序列

andas为处理时间序列数据提供了强大的工具,尤其在金融领域中。在处理时间序列数据时,我们经常会遇到以下问题:

  • 生成时间序列
  • 将时间序列转换为不同的频率

例5:获取当前时间

Timestamp.now()会给出当前的日期和时间。

import pandas as pd
print(pd.Timestamp.now())

运行结果: 

例6:创建时间戳

时间戳数据是将值与特定时间点关联的最基本的时间序列数据类型。

import pandas as pd
print(pd.Timestamp('2017-03-01'))

运行结果: 

 

例7:设置时间单位

还可以将整数或浮点数的纪元时间转换为时间戳。这些的默认单位是纳秒(因为时间戳是以纳秒存储的)。然而,纪元通常以另一个可以指定的单位存储。

import pandas as pd
print(pd.Timestamp(2074831906000,unit='ms'))

运行结果:

例8:如何得到时间戳的值 

import pandas as pd
time_str = '2035-10-01 6:11:46'
print(pd.to_datetime(time_str).value)

运行结果: 

 

例9:创建一个时间范围

import pandas as pd
print(pd.date_range("11:00", "13:30", freq="30min"))
print('-'*50)
print(pd.date_range("11:00", "13:30", freq="30min").time)

运行结果:

例10:改变时间的频率

import pandas as pd
print(pd.date_range("11:00", "13:30", freq="h").time)

运行结果:

例11:混合类型 

import pandas as pd
print(pd.to_datetime(['2005/11/23', '2010.12.31', None],format='mixed'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值