pandas数据拼接详解:join、concat与stack操作示例

Leo
Leo
发布时间:2026-10-13 | 5人浏览过
原创

本文详细介绍pandas中数据拼接的多种方法,包括使用join()合并无重复列的DataFrame、利用concat()按行或列拼接Series及DataFrame,以及通过combine_first()处理索引重复的情况。此外,还演示了stack()与unstack()在行列转换中的应用,帮助开发者高效处理数据整合任务。

pandas数据拼接详解:join、concat与stack操作示例

前言

在实际数据处理中,pandas的数据拼接功能常被用于解决重复数据合并问题。例如,当需要获取两份数据的交集或并集时,拼接操作是一个高效的选择。本文将基于实用角度,简要介绍相关实现方式。

数据拼接基础

在学习复杂的数据转换之前,掌握基础的数据拼接知识是必要的预备步骤。

2.1 join()联结

2.1 join()联结

关于merge操作,由于其与SQL表联结逻辑相似,内容较为复杂,本文暂不展开,后续可能会单独撰文详解。

join()函数主要用于将两个DataFrame合并为一个整体,其前提条件是这两个DataFrame之间不存在重复的列名。


# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np

data1 = {
  'user' : ['zszxz','craler','rose'],
  'price' : [100, 200, 300],
  'hobby' : ['reading','running','hiking']
}
index1 = ['user1','user2','user3']
frame1 = pd.DataFrame(data1,index1)

data2 = {
  'person' : ['zszxz','craler','rose'],
  'number' : [100, 2000, 3000],
  'activity' : ['swing','riding','climbing']
}
index2 = ['user1','user2','user3']
frame2 = pd.DataFrame(data2,index2)

join = frame1.join(frame2)
print(join)

执行结果如下所示:

user price hobby person number activity user1 zszxz 100 reading zszxz 100 swing user2 craler 200 running craler 2000 riding user3 rose 300 hiking rose 3000 climbing

2.2 concat()拼接

2.2 concat()拼接

concat()函数可用于将两个Series对象拼接为一个Series,默认情况下按照行方向进行拼接。


ser1 = pd.Series(['111','222',np.NaN])
ser2 = pd.Series(['333','444',np.NaN])
# 默认按行拼接
print(pd.concat([ser1, ser2]))

若希望按列方向进行拼接,需设置参数axis = 1。


ser1 = pd.Series(['111','222',np.NaN])
ser2 = pd.Series(['333','444',np.NaN])
# 按列拼接
print(pd.concat([ser1, ser2],axis=1))

拼接后的输出结果如下:

0 1 0 111 333 1 222 444 2 NaN NaN

进一步地,通过指定keys参数,输出的数据结构将转换为DataFrame格式。


ser1 = pd.Series(['111','222',np.NaN])
ser2 = pd.Series(['333','444',np.NaN])
# 按列拼接
data = pd.concat([ser1, ser2],axis=1, keys=['zszxz', 'rzxx'])
print(data)

具体输出结果如下:

zszxz rzxx 0 111 333 1 222 444 2 NaN NaN

需要注意的是,DataFrame的concat操作逻辑与Series类似。

2.3 combine_first()组合

2.3 combine_first()组合

当索引存在重复时,可以使用combine_first()方法进行拼接处理。


ser1 = pd.Series(['111','222',np.NaN],index=[1,2,3])
ser2 = pd.Series(['333','444',np.NaN,'555'],index=[1,2,3,4])
data = ser1.combine_first(ser2)
print(data)

示例输出结果如下:

1 111 2 222 3 NaN 4 555 dtype: object

若交换Series的位置,基准数据将变为ser2。


ser1 = pd.Series(['111','222',np.NaN],index=[1,2,3])
ser2 = pd.Series(['333','444',np.NaN,'555'],index=[1,2,3,4])
data = ser2.combine_first(ser1)
print(data)

此时输出结果变为:

1 333 2 444 3 NaN 4 555 dtype: object

2.4 轴转换

2.4 轴转换

准备的基础数据如下:


# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np

data = {
  'user' : ['zszxz','craler','rose'],
  'price' : [100, 200, 300],
  'hobby' : ['reading','running','hiking']
}
index = ['user1','user2','user3']
frame = pd.DataFrame(data,index)
print(frame)

原始DataFrame输出为:

user price hobby user1 zszxz 100 reading user2 craler 200 running user3 rose 300 hiking

stack()函数可将列索引转换为行索引,实现数据的堆叠。


# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np

data = {
  'user' : ['zszxz','craler','rose'],
  'price' : [100, 200, 300],
  'hobby' : ['reading','running','hiking']
}
index = ['user1','user2','user3']
frame = pd.DataFrame(data,index)
print(frame.stack())

转换后的输出结果如下:

user1 user zszxz price 100 hobby reading user2 user craler price 200 hobby running user3 user rose price 300 hobby hiking dtype: object

使用unstack()函数可将上述结构还原为原始的DataFrame格式。


# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np

data = {
  'user' : ['zszxz','craler','rose'],
  'price' : [100, 200, 300],
  'hobby' : ['reading','running','hiking']
}
index = ['user1','user2','user3']
frame = pd.DataFrame(data,index)
sta = frame.stack()
print(sta.unstack())

还原后的输出结果如下:

user price hobby user1 zszxz 100 reading user2 craler 200 running user3 rose 300 hiking

至此,关于pandas数据拼接的示例介绍完毕。如需了解更多相关内容,建议查阅本站过往文章或继续关注后续更新。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表