python pandas数据连接
0 背景
pd.concat()
是 pandas 库中一个非常有用的函数,主要用于合并两个或多个 pandas 对象。这些对象通常是 DataFrame 或 Series,但也可以是其他可迭代的 pandas 对象。pd.concat()
非常灵活,支持不同的合并方式,如纵向拼接、横向拼接等。
在之前的文章中我们提到了使用 _append() / append()
方法进行数据的连接: python pandas数据追加 , _append()
是最简单直接的数据合并方式, 但是在官方的提示中, append()
方法在未来的版本将移除, 更建议我们使用pandas.concat
方法, 因此, 本文主要围绕pandas.concat
方法进行数据的连接。
1 使用
基本语法
def concat(
objs: Iterable[Series | DataFrame] | Mapping[HashableT, Series | DataFrame],
*,
axis: Axis = 0,
join: str = "outer",
ignore_index: bool = False,
keys=None,
levels=None,
names: list[HashableT] | None = None,
verify_integrity: bool = False,
sort: bool = False,
copy: bool | None = None,
) -> DataFrame | Series:
参数解释:
-
objs: 要合并的 pandas 对象的列表或字典。这是唯一必需的参数。 -
axis: {0/’index’, 1/’columns’},默认为 0。如果是 0,合并将发生在行上(纵向合并)。如果是 1,则合并发生在列上(横向合并)。 -
join: {‘inner’, ‘outer’},默认为 ‘outer’。指定如何处理不同对象之间的索引。’outer’ 会取索引的并集,’inner’ 会取交集。 -
ignore_index: 布尔值,默认为 False。如果为 True,则不使用连接轴上的索引值,而是创建一个新的 range 索引。 -
keys: 一个序列,默认为 None。如果传递了一个序列,则为创建的层次化索引提供了一个级别。 -
levels: 在多层次索引对象上使用的索引的特定级别,默认为 None。 -
names: 要为创建的层次化级别使用的名称列表,默认为 None。 -
verify_integrity: 布尔值,默认为 False。如果为 True,则会检查新连接的轴是否包含重复项。如果有,将引发异常。 -
sort: 布尔值,默认为 False。在沿轴连接时,根据连接键对数据进行排序。如果设置为 True,则会对连接键进行排序。 -
copy: 布尔值,默认为 True。如果为 False,则不会复制数据,从而节省内存。
导入数据
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'A': [2, 3],
'B': ['x', 'y']
})
df2 = pd.DataFrame({
'A': [6, 7],
'B': ['z', 'w'],
})
df3 = pd.DataFrame({
'A': [9, 1, 7],
'B': ['k', 'u', 'n']
})
简单连接
pd.concat()
的基本操作可以实现在前一篇讲的df._append()
功能, 另外官方也更建议使用pd.concat()
进行数据的连接, 未来append()
方法有可能被弃用.
# 简单连接
pd.concat([df1, df2])
# A B
# 0 2 x
# 1 3 y
# 0 6 z
# 1 7 w
# 和 df1._append(df2) 效果一样
df1._append(df2)
# A B
# 0 2 x
# 1 3 y
# 0 6 z
# 1 7 w
按列连接
# 按列拼接
pd.concat([df1, df2], axis=1)
# 结果有两个A列, 两个B列
# A B A B
# 0 2 x 6 z
# 1 3 y 7 w
交集合并
合并的方式默认是并集: join='outer'
# 合并交集
df3 = pd.DataFrame({
'A': [9, 1, 7],
'B': ['k', 'u', 'n']
})
pd.concat([df1, df3], join='inner', axis=1)
# 留下了索引都存在几个表的内容
# A B A B
# 0 2 x 9 k
# 1 3 y 1 u
# join默认合并方式是outer, 也就是并集
pd.concat([df1, df3], join='outer', axis=1)
pd.concat([df1, df3], axis=1)
# A B A B
# 0 2.0 x 9 k
# 1 3.0 y 1 u
# 2 NaN NaN 7 n
同时, 除了这种方式之外, 我们还可以通过reindex
的方法实现交集的功能
# 同时, 除了这种方式之外, 我们还可以通过`reindex`的方法实现交集的功能
pd.concat([df1, df3], axis=1).reindex(df1.index)
pd.concat([df1, df3.reindex(df1.index)], axis=1)
# A B A B
# 0 2.0 x 9 k
# 1 3.0 y 1 u
# 保留df3相同的索引结构
pd.concat([df1, df3], axis=1).reindex(df3.index)
# A B A B
# 0 2.0 x 9 k
# 1 3.0 y 1 u
# 2 NaN NaN 7 n
reindex
方法是 Pandas 中的一个重要功能,主要用于更改 DataFrame 或 Series 的行或列索引。它可以改变或重排现有数据的索引顺序,或者添加缺失的索引(对于新索引中不存在于原始对象中的索引,会引入缺失值)。
连接单条序列
# 连接单条数据
one = pd.Series(['may', 'day'], name='C')
pd.concat([df1, one], axis=1)
# A B C
# 0 2 x may
# 1 3 y day
不能用于直接连接列表, 须以Series序列的形式连接
# 不能直接连接列表, 须以Series序列的形式连接
one = ['may', 'day']
pd.concat([df1, one], axis=1)
# TypeError: cannot concatenate object of type '<class 'list'>'; only Series and DataFrame objs are valid
如果是按列拼接, 我们可以直接使用添加列的方法更方便
# 那么如果是连接一列的话, 我们可以通过添加列的形式进行连接
df1.assign(C=one)
# or
df1['C'] = one
指定索引
我们可以给要连接的每一个数据表一个一级索引,形成多层索引,这样我们可以直观地看到数据分别来自哪个DataFrame。
# 指定索引名
pd.concat([df1, df2], keys=['a', 'b'])
# A B
# a 0 2 x
# 1 3 y
# b 0 6 z
# 1 7 w
# 以字典形式指定
pd.concat({'a': df1, 'b': df2})
# A B
# a 0 2 x
# 1 3 y
# b 0 6 z
# 1 7 w
按列合并地时候指定索引
# 按列合并地时候指定索引
pd.concat([df1, df2], axis=1, keys=['a', 'b'])
# a b
# A B A B
# 0 2 x 6 z
# 1 3 y 7 w
多文件合并
有时候我们在办公过程中, 某一文件夹下有很多相同结构的excel文件, 手动合并就很麻烦, 这个时候我们可以使用pd.concat()
函数批量合并.
数量少的合并:
# 简单一点的
df4 = pd.DataFrame({...})
df5 = pd.read_excel('xxx.xlsx')
df6 = pd.read_csv('xxx.csv')
df = pd.concat([df4, df5, df6])
大量文件合并, 我们可以借助glob
或者pathlib
模块获取文件夹下所有的xlsx文件进行合并, 关于glob
或者pathlib
模块我们在之前的文章也提到过: python 文件匹配工具:glob & pathlib
# 我们使用glob或者pathlib模块获取文件夹下所有的xlsx文件
import glob
files = glob.glob('./data/*.xlsx')
dfs = [pd.read_excel(file) for file in files]
df = pd.concat(dfs)
from pathlib import Path
files = Path('./data/').glob('*.xlsx')
dfs = [pd.read_excel(file) for file in files]
df = pd.concat(dfs)
# or, 通过map方法
df = pd.concat(map(pd.read_excel, glob.glob('./data/*.xlsx')))
2 关于
相较于 append()
方法,pd.concat()
的功能更加全面且强大,作为 Pandas 中的一种多用途工具,它能够灵活地处理各类 DataFrame 序列数据的合并。这一方法不仅便于获取交集和并集数据,而且在处理多文件数据合并的场景中尤为高效,让我们进行数据处理时变得更加便捷和直观。
欢迎关注我的微信公众号
原文始发于微信公众号(其之):python pandas数据连接
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204749.html