前面内容:pandas(08 缺失数据和分组)
目录
一、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'))