搞懂Pandas数据合并,这一篇就够了!

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

两岸猿声啼不住,轻舟已过万重山。

数据合并是数据处理过程中的必经环节,pandas作为数据分析的利器,提供了四种常用的数据合并方式(concat,merge,append,join),让我们看看如何使用这些方法吧!

1.concat()

concat() 可用于两个及多个 DataFrame 间行/列方向进行内联或外联拼接操作,默认对行(沿 y 轴)取并集。

「使用方式」

pd.concat(
    objs: Union[Iterable[~FrameOrSeries], Mapping[Union[Hashable, NoneType], ~FrameOrSeries]],
    axis=0,
    join='outer',
    ignore_index: bool = False,
    keys=None,
    levels=None,
    names=None,
    verify_integrity: bool = False,
    sort: bool = False,
    copy: bool = True,
)

「主要参数」

  • objs:一个序列或是Series,DataFrame对象的映射。

  • axis:连接的轴,0('index',行),1('columns',列),默认为0。

  • join:连接方式 ,inner(交集), outer(并集),默认为outer。

  • ignore_index:是否重置串联轴的索引值。如果为True,则重置索引为0,…, n - 1。

  • keys:创建层次化索引。可以是任意值的列表或数组、元组数组、数组列表(如果将levels设置成多级数组的话)

  • names:生成的分层索引中级别的名称。

示例

创建两个 DataFrame

df1 = pd.DataFrame(
          {'char': ['a', 'b'],
           'num': [1, 2]})
df2 = pd.DataFrame(
          {'char': ['b', 'c'],
           'num': [3, 4]})
4ac4776df5280ef3b6cfec01f008f303.png

concat() 默认会对行方向进行拼接操作,连接方式 outer

pd.concat([d1, d2])
485a0f42ed91f460b4d74914588fd62c.png

清除现有索引并重置索引。

pd.concat(
    [d1, d2],
    ignore_index=True)
7e7ad371352b4a3b9bbdca2b7a3c46e0.png

通过 keys 参数在数据的最外层添加分层索引。

pd.concat(
    [d1, d2],
    keys=['d1', 'd2'])
b9224fb6c882e14b482a1b236c19aa76.png

指定 names 参数来标记创建的索引键。

pd.concat(
    [d1, d1],
    keys=['d1', 'd2'],
    names=['DF Name', 'Row ID'])
c2b1d4732bafee548e11eb1979defaf3.png

将两个 DataFrame 与重叠的列进行组合并返回所有内容。交集外的列填充 NaN

df3 = pd.DataFrame(
          {'char': ['b', 'c'],
          'float': [3.0, 4.0]})
pd.concat([df1, df3])
490295aff43127a37e4fb4083da5a5ad.png

将两个 DataFrame 与重叠的列进行组合,只返回重叠列的内容。

pd.concat(
    [df1, df3],
    join="inner")
3b08e9eb8b7b5826b3164c2a4ba94493.png

指定 axis=1 沿 x 轴水平组合 DataFrame 对象。

df4 = pd.DataFrame(
          {'char': ['b', 'c', 'd'],
           'num': [3, 4, 5]},
           index=range(1, 4))
pd.concat([df1, df4], axis=1)
fb8d326a688b070a452ee7c35e151299.png

2.merge()

merge() 只能用于两个 DataFrame 间列方向进行内联或外联合并操作,默认列合并(沿 x 轴),取交集(即:以两个 DataFrame 列名的交集作为连接键)

「使用方式」

pd.merge(
    left,
    right,
    how: str = 'inner',
    on=None,
    left_on=None,
    right_on=None,
    left_index: bool = False,
    right_index: bool = False,
    sort: bool = False,
    suffixes=('_x', '_y'),
    copy: bool = True,
    indicator: bool = False,
    validate=None,
)

「参数」

  • left:DataFrame

  • right:DataFrame 或者带有 name 的Series

  • how:{'left', 'right', 'outer', 'inner'}, 默认为 'inner',连接的方式

  • on:用于连接的列索引名称,必须同时存在于左、右两个DataFrame中,默认是以两个DataFrame列名的交集作为连接键。

  • left_on:左侧DataFrame中用于连接键的列名,这个参数在左右列名不同但代表的含义相同时非常有用;

  • right_on:右侧DataFrame中用于连接键的列名

  • left_index:默认为False,不使用左侧DataFrame中的行索引作为连接键(但是这种情况下最好用JOIN)

  • right_index:默认为False,不使用右侧DataFrame中的行索引作为连接键( 但是这种情况下最好用JOIN)

  • sort:默认为False,将合并的数据进行排序,设置为False可以提高性能

  • suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’, ‘_y’)

  • copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能

  • indicator:显示合并数据中数据的来源情况

  • validate:{"one_to_one" or "1:1", "one_to_many" or "1:m", "many_to_one" or "m:1", "many_to_many" or "m:m"}如果指定,则检查合并是否为指定类型。

示例

创建两个DataFrame

df1 = pd.DataFrame(
          {'name': ['A1', 'B1', 'C1'],
           'grade': [60, 70, 80]})
df2 = pd.DataFrame(
          {'name': ['B1', 'C1', 'D1'],
           'grade': [70, 80, 100]})
6740c9e56a7d76f89911da94f8e84926.png

merge() 默认情况下,会根据两个 DataFrame 中同时存在的列进行合并,合并方法采用取交集的方式。

df1.merge(df2)
30ea1aec8875e0178dbd2375fe5568a5.png

指定合并的方式为 outer,取并集。

df1.merge(df2, how='outer')
c7315fc21e3f8c63e7c67ee618583061.png

下面再创建两个 DataFrame

df1 = pd.DataFrame(
      {'name1': ['A1', 'B1', 'B1', 'C1'],
       'grade': [60, 70, 80, 90]})
df2 = pd.DataFrame(
      {'name2': ['B1', 'C1', 'D1', 'E1'],
       'grade': [70, 80, 90, 100]})
c63c0fb112fb695b1848899a5293e1b0.png

根据 name1name2 列合并 df1df2grade 列附加了默认后缀 _x_y

df1.merge(
    df2,
    left_on='name1',
    right_on='name2')
9fe4a87f77e096790349281d36a3fff2.png

合并 df1df2,并将指定的左右后缀附加到重叠列末尾。

df1.merge(
    df2,
    left_on='name1',
    right_on='name2',
    suffixes=('_1', '_2'))
dd4c01efe05b232b468bd9ed3b7ff629.png

3.append()

append() 可用于两个及多个 DataFrame 间行方向(沿 y 轴)的拼接操作,默认取并集。

「使用方式」

df1.append(
    other,
    ignore_index=False,
    verify_integrity=False,
    sort=False)

「参数」

  • other : 指定要添加的数据。DataFrame 或 Series 对象,或这些对象的列表

  • ignore_index: 是否忽略索引,如果为 True,轴将被重置为 0, 1, ..., n - 1。默认为False

  • verify_integrity:如果为 True,则在创建具有重复项的索引时引发 ValueError。默认为 False

  • sort : 如果 df1 和 other 的列未对齐,则对列进行排序。默认为 False。

示例

创建两个 DataFrame

df1 = pd.DataFrame(
          [[1, 2], [3, 4]],
          columns=list('AB'))
df2 = pd.DataFrame(
          [[5, 6], [7, 8]],
          columns=list('BC'))
60fce909afa19b8c6c2d43fbf895b6cf.png

append() 在默认情况下会沿y轴垂直拼接两个 DataFramedf1df2 交集外的列填充 NaN

df1.append(df2)
a4fd54880ead095115e42289ad312b20.png

ignore_index 设置为 True,来达到重置轴的索引。

df1.append(df2, ignore_index=True)
d5f4484261892986c54af7b27ec61b9b.png

4.join()

join() 用于两个及多个 DataFrame 间列方向(沿 x 轴)的拼接操作,默认左拼接。

「使用方式」

df1.join(
    other,
    on=None,
    how='left',
    lsuffix='',
    rsuffix='',
    sort=False)
  • other:指定要添加的数据。DataFrame 或 Series 对象,或这些对象的列表

  • on:连接的列,默认使用索引连接

  • how:{'left', 'right', 'outer', 'inner'}, 默认为 'left',连接的方式

  • lsuffix:默认为空字符串,表示df1中重复列的后缀

  • rsuffix:other中重复列的后缀

  • sort:按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。

示例

创建两个 DataFrame

df1 = pd.DataFrame(
          {'A': ['A0', 'A1', 'A2', 'A3', 'A4'],
          'val': ['V0', 'V1', 'V2', 'V3', 'V4']})
df2 = pd.DataFrame(
          {'B': ['B3', 'B4', 'B5'],
          'val': ['V3', 'V4', 'V5']})
4b5b81b08adbde37df77061aa1b22727.png

如果我们想使用 val 列进行连接,我们需要将 val 设置为 df1df2 中的索引。

df1.set_index('val').join(
    df2.set_index('val'))
04dd1bc862cc0f6353b15d5f7e068061.png

使用 val 列连接的另一个方法是指定 on 参数。df1.join 只能使用 df2 的索引,但可以使用 df1 中的任何列。所以可以只将 df2 中的 val 列转为索引,并通过 on 参数指定 df1 的连接列为 val

df1.join(
    df2.set_index('val'),
    on='val')
26af4e52157022c0331d26d872211908.png

使用外连接的方式连接 df1df2

df1.join(
    df2.set_index('val'),
    on='val',
    how='outer')
ee9c8235b7f81f55a0ad3491390dcd4a.png

四种方法总结

  • concat() 可沿任意轴连接 Pandas 对象,并且可在串联轴上添加一层分层索引

  • join() 主要用于基于行索引进行列的拼接

  • merge() 使用数据库样式的连接合并,连接是基于列或索引。

  • 一般情况下 append(), join() 可以看成是 concat()merge()的简易版,参数较少,易用性比较强。

不同的方式适用于不同的场景,实践是加深记忆的最快!


码字不易!你的「点赞」「分享」「在看」「收藏」是对我最大的支持!

a0fa8f548e94797095e77d4f0a4c8052.png

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

e7d379fd7295b604699ac476be8c70e0.png

------------------- End -------------------

往期精彩文章推荐:

5b451405448a8c65b59d731b804fddd1.png

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种功能强大的编程语言,可以被用于办公自动化,其中包括Excel表格的自动化处理。下面我们将详细介绍如何使用Python实现Excel表格的自动化处理。 Python的第三方库openpyxl可以用于处理Excel文件。首先,我们需要安装openpyxl库,可以通过pip命令进行安装。安装完成后,我们可以使用openpyxl库中的函数和方法进行Excel表格的读取、写入和修改。 读取Excel文件非常简单,我们可以使用openpyxl库的load_workbook函数,指定要读取的文件路径,然后使用get_sheet_by_name函数选择要操作的工作表。这样,我们就可以使用cell函数来获取特定单元格的值。 写入和修改Excel文件也很容易。我们可以使用openpyxl库的Workbook函数创建一个新的Excel文件,然后使用create_sheet函数添加工作表。对于已经存在的Excel文件,我们可以使用Workbook的load_workbook函数打开文件,然后可以对工作表进行操作,例如使用cell函数来写入数据或修改单元格的值。 除了基本的读取、写入和修改操作,Python还可以进行更复杂的Excel表格自动化处理。我们可以根据条件筛选数据合并或拆分单元格、插入和删除行列、设置单元格的格式等。 在实际的办公自动化应用中,Python的openpyxl库配合其他功能强大的库如pandas、numpy等,可以实现更多高级操作。同时,我们还可以使用Python库比如xlwings从Excel中调用Python代码,进一步提高Excel表格的自动化处理能力。 总而言之,Python可以通过openpyxl库实现Excel表格的自动化处理。通过读取、写入和修改单元格,我们可以实现数据的快速处理和分析。此外,Python还能进行更复杂的Excel操作,为办公自动化带来更多便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值