首页 > pandas 阅读数:19

pandas沿轴连接数据(concat()和append())

有时候我们想要的数据合并结果是数据的轴向连接,在 pandas 中这可以通过 concat() 函数或 append() 函数来实现。对于这2个函数,你了解吗?

concat() 函数

在 pandas 中,利用 concat() 函数可以沿轴对数据进行简单的连接。concat 方法相当于数据库中的全连接 (Union All),可以指定按某个轴进行连接,也可以指定 join 连接的方式(只有 outer、inner 两种)。

与数据库不同的是 concat 方法不能去重,如要实现去重的效果,可以使用 drop_duplicates 方法。轴向连接数据就是单纯地将两个表拼接,这个过程也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)。

concat() 函数的语法格式如下。

pandas.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,
keys=None,levels=None,names=None,verify_integrity=False,copy=Tru,esort=
False)

函数中的参数说明如下:
  • objs:需要连接的对象集合,一般是 Series、DataFrame、list 或 dict;
  • axis:表示数据合并的轴方向,默认为 0,axis=0 表示纵向,axis=1 表示横向;
  • join:表示连接方式,取值{outer,inner},默认为 outer 外连接,其结果是取所连接的数据集中键值并集的数据,取值为 inner 内连接,其结果是取所连接的数据集中键值交集的数据;
  • join_axes:接收列表,表示自定义索引对象的列表;
  • ignore_index:接收 boolean 值,默认为 False,如果为 True,请不要使用串联轴上的索引值,生成的轴将被标记为 0,…,n-1;
  • keys:接收序列,默认值为 None,使用传递的键作为最外层构建层次索引,如果为多索引,应使用元组;
  • levels:接收列表的序列,默认为 None,用于构建 MultiIndex(层次索引)的特定级别;
  • names:接收列表,默认为 None,表示 MultiIndex(层次索引)的级别的名称;
  • verify_integrity:接收 boolean 值,默认为 False,检查新连接的轴是否包含重复项;
  • copy:接收 boolean值,默认为 True,如果为 False,表示不复制数据;
  • sort:如果为 True,则将合并的数据进行排序,默认为 False,但在横向外连接或者 ignore_index=True 时要设置此参数。

【例 1】使用 concat() 函数,通过选择不同的参数,观察实现多个数据集的沿轴连接的效果。

其示例代码 test1.py 如下。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
#定义3个Series
s1 = pd.Series([0, 1, 2], index=['a', 'b', 'c'])
s2 = pd.Series([3, 4, 5, 6], index=['d', 'e', 'f', 'g'])
s3 = pd.Series([7, 8, 9], index=['h', 'i', 'j'])
print('将s1,s2,s3纵向外连接')
result = pd.concat([s1, s2, s3])
print(result)
print('将s1,s2,s3横向外连接')
result =pd.concat([s1, s2, s3], axis=1,sort=False)
print(result)
print('将s1*2,s3纵向外连接')
s4 = pd.concat([s1 * 2, s3])
print(s4)
print('将s1,s4横向外连接')
result = pd.concat([s1, s4], axis=1,sort=False)
print(result)

print('将s1,s4横向内连接')
result = pd.concat([s1, s4], axis=1, join='inner')
print(result)
print('将s1,s4横向外连接,自定义索引')
result = pd.concat([s1, s4], axis=1, join_axes=[['a', 'c', 'b', 'e']],
                   sort=False)
print(result)
print('将s1,s2,s3纵向外连接,设置层次索引')
result = pd.concat([s1, s1, s3], keys=['one', 'two', 'three'])
print(result)

print('将s1,s2,s3横向外连接,设置层次索引')
result = pd.concat([s1, s2, s3], axis=1, keys=['one', 'two', 'three'],
                   sort=False)
print(result)
#定义2个DataFrame
df1 = pd.DataFrame(np.arange(6).reshape(3, 2), index=['a', 'b', 'c'],
             columns=['one', 'two'])
df2 = pd.DataFrame(5 + np.arange(4).reshape(2, 2), index=['a', 'c'],
             columns=['three', 'four'])
print('将df1,df2横向外连接,设置层次索引')
result = pd.concat([df1, df2], axis=1, keys=['level1', 'level2'],
                   sort=False)
print(result)
print('使用字典设置层次索引,横向外连接')
result = pd.concat({'level1': df1, 'level2': df2}, axis=1, sort=False)
print(result)
print('将df1,df2横向外连接,设置层次索引和设置层次索引的级别名称')
result = pd.concat([df1, df2], axis=1, keys=['level1', 'level2'],
                   names=['upper', 'lower'],sort=False)
print(result)
#将两个不相同的列的数据框合并
df1 = pd.DataFrame(np.random.randn(3, 4), columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.random.randn(2, 3), columns=['b', 'd', 'a'])
print('df1,df2纵向外连接,忽略原index,重建索引')
print(pd.concat([df1, df2], ignore_index=True,sort=Fals

总结出 concat() 函数具有以下特点:
1) 当 concat() 函数作用于 Series 时,如果 axis=0,类似于 union(数据联合);如果 axis=1,则组成一个 DataFrame,索引是 union 后的结果,列是类似 join 后的结果;
2) 通过参数 join_axes=[] 指定自定义索引;
3) 通过参数 keys=[] 创建层次化索引。利用 keys 参数可以为合并后的数据集增加一个键,通过该键指明合并数据集中不同的数据来源;
4) 通过参数 ignore_index=True 可重建索引。利用该参数可以实现将两个不同的列的 DataFrame 合并,其中无效的值用 NaN 表示。

append() 函数

append() 函数是 concat() 函数的简略形式,但是 append() 函数只能在 axis=0 上进行数据合并。append() 函数的语法格式如下。

left.append(right)  或  left.append(right,ignore_index=True)

该函数的功能为:将 left 指定数据集与 right 指定数据集进行纵向合并。其中,DataFrame 与 Series 进行合并时,需要使用参数 ignore_index=True。

其示例代码 example2.py 如下。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
left = pd.DataFrame({'one':np.arange(4),'two':list('abcd')}
right = pd.DataFrame({'three':[4,5],'four': ['e', 'f']})
s1 = pd.Series([0, 1, 2], index=['a', 'b', 'c'])
result = left.append(right,sort=False)
result1 = left.append(s1,ignore_index=True)

print('左边数据:','\n',left,'\n','右边数据:','\n',
      right,'\n','合并数据:','\n',result)
print('左边数据:','\n',left,'\n','右边数据:','\n',
      s1,'\n','合并数据:','\n',result1)

最后一条输出语句的输出结果如下。
左边数据:
    one two
0    0   a
1    1   b
2    2   c
3    3   d
右边数据:
a    0
b    1
c    2
dtype: int64
合并数据:
   one  two  a    b    c
0  0.0    a  NaN NaN NaN
1  1.0    b  NaN NaN NaN
2  2.0    c  NaN NaN NaN
3  3.0    d  NaN NaN NaN
4  NaN  NaN  0.0 1.0 2.0