python pandas数据连接

python pandas数据连接

0 背景

python pandas数据连接

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:

参数解释:

  1. objs: 要合并的 pandas 对象的列表或字典。这是唯一必需的参数。
  2. axis: {0/’index’, 1/’columns’},默认为 0。如果是 0,合并将发生在行上(纵向合并)。如果是 1,则合并发生在列上(横向合并)。
  3. join: {‘inner’, ‘outer’},默认为 ‘outer’。指定如何处理不同对象之间的索引。’outer’ 会取索引的并集,’inner’ 会取交集。
  4. ignore_index: 布尔值,默认为 False。如果为 True,则不使用连接轴上的索引值,而是创建一个新的 range 索引。
  5. keys: 一个序列,默认为 None。如果传递了一个序列,则为创建的层次化索引提供了一个级别。
  6. levels: 在多层次索引对象上使用的索引的特定级别,默认为 None。
  7. names: 要为创建的层次化级别使用的名称列表,默认为 None。
  8. verify_integrity: 布尔值,默认为 False。如果为 True,则会检查新连接的轴是否包含重复项。如果有,将引发异常。
  9. sort: 布尔值,默认为 False。在沿轴连接时,根据连接键对数据进行排序。如果设置为 True,则会对连接键进行排序。
  10. copy: 布尔值,默认为 True。如果为 False,则不会复制数据,从而节省内存。

导入数据

import pandas as pd
import numpy as np
df1 = pd.DataFrame({
    'A': [23],
    'B': ['x''y']
})

df2 = pd.DataFrame({
    'A': [67],
    'B': ['z''w'],
})

df3 = pd.DataFrame({
    'A': [917],
    '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': [917],
    '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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!