前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >熟练掌握 Pandas 合并术,数据处理不再伤脑筋

熟练掌握 Pandas 合并术,数据处理不再伤脑筋

作者头像
用户4945346
发布2024-05-27 20:20:41
2540
发布2024-05-27 20:20:41
举报
文章被收录于专栏:pythonista的日常pythonista的日常

当我们有多个数据文件,每个文件都读取为一个单独的 DataFrame 时,需要合并这些 DataFrame 时,就需要使用 concat() 方法。

这是 pandas 快速上手系列的第 4 篇文章,本篇详细介绍了 concat 的使用和示例。pandas中的 concat() 方法用于将两个或多个 DataFrame 对象沿着行 axis=0 或者列 axis=1 的方向拼接在一起,生成一个新的DataFrame对象。

语法:

代码语言:javascript
复制
pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,
              levels=None, names=None, verify_integrity=False, sort=False,
              copy=True)

参数说明:

objs: 是一个序列或 Series/DataFrame 的字典,即需要合并的数据对象

axis: 指定合并的轴向,axis=0 是纵向合并(增加行数), axis=1 是横向合并(增加列数)

join: 连接方式,有 inner (相交部分)和 outer (并集部分)

ignore_index: 设置为 True 时,合并后的数据索引将重新排序

keys: 用于构造合并后层次化的索引,可以给每个数据源命名

纵向合并两个DataFrame,设置 axis=0

代码语言:javascript
复制
import pandas as pd

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

res = pd.concat([df1, df2], axis=0, ignore_index=True)
print(res)

输出:

代码语言:javascript
复制
   A  B
0  1  3 
1  2  4
2  5  7
3  6  8

横向合并两个DataFrame,设置 axis=1

代码语言:javascript
复制
import pandas as pd

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]})

res = pd.concat([df1, df2], axis=1)
print(res)

输出:

代码语言:javascript
复制
   A  B  C  D
0  1  3  5  7
1  2  4  6  8

join='inner'表示取两个 DataFrame 的行列索引的交集进行拼接

代码语言:javascript
复制
import pandas as pd

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}, index=[1, 2])
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]}, index=[2, 3])
# 横向合并,取交集行索引是2的部分
res = pd.concat([df1, df2], axis=1, join='inner')
print(res)

输出:

代码语言:javascript
复制
   A  B  C  D
2  2  4  5  7

可以看到,最终结果只保留了两个 DataFrame 行索引的交集部分,即索引为2这一行。

join='outer'表示取两个 DataFrame 的行列索引的并集进行拼接,缺失值为NaN

代码语言:javascript
复制
import pandas as pd

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}, index=[1, 2])
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]}, index=[2, 3])
# 横向合并,并集拼接
res = pd.concat([df1, df2], axis=1, join='outer')
print(res)

输出:

代码语言:javascript
复制
   A    B    C    D
1  1.0  3.0  NaN  NaN
2  2.0  4.0  5.0  7.0
3  NaN  NaN  6.0  8.0

可以看到,最终结果保留了两个 DataFrame 行索引的并集,缺失值用 NaN 填充。join='inner' 表示取索引交集,join='outer' 表示取并集。在实际工作中,我们可以根据具体需求选择合适的连接方式。一般来说,如果希望保留两个数据源中所有数据就用 outer ,如果只需要保留两者公共部分就用 inner 。

给数据源命名并层次化索引

代码语言:javascript
复制
import pandas as pd

df1 = pd.DataFrame({'A': [1, 2]})
df2 = pd.DataFrame({'B': [3, 4]}) 

# keys 的长度必须和df中的列名的长度一样
res = pd.concat([df1, df2], axis=1, keys=['X', 'Y'])
print(res)

输出:

代码语言:javascript
复制
   X   Y
   A   B
0  1   3
1  2   4

当使用 pd.concat() 合并多个 DataFrame 时,如果不指定 keys 参数,合并后的 DataFrame 的索引默认就是按顺序的范围索引(range index)或原始的索引。

但有时我们想要在合并后的结果中区分出不同 DataFrame 的来源,从而构造一个多层级索引(hierarchical index),这时就需要用到 keys 参数了。

keys 允许我们为每个被合并的 DataFrame 指定一个标记名称,这个标记将作为最外层级索引。

上面就是将 X, Y 设置了多层级索引

代码语言:javascript
复制
In [19]: res = pd.concat([df1, df2], axis=1, keys=['X', 'Z'])

In [20]: res
Out[20]:
   X  Z
   A  B
0  1  3
1  2  4

In [21]: res['X']
Out[21]:
   A
0  1
1  2
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 pythonista的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档