pd.concat轴向连接或绑定或堆叠 2018/12/29
1.函数
====================================================================
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
用途:沿轴执行连接
# 要连接任意数量的pandas对象(DataFrame或Series)
参数 #说明
objs #序列或数据帧的列表或字典。字典键名用作keys层次化索引(最外层levels[0])
axis=0 #指明连接的轴
join="outer" #轴向上的索引是按交集inner还是并集outer进行合并
join_axes=None #索引对象列表。用于其他n-1轴的特定索引,不执行并集/交集运算
#即选取数据都有的索引进行合并
keys=None #连接轴向上的层次化索引。可以是任意值的列表或数组、元组数组、数组列表(如果将levels设置成多级数组的话)
levels =None #指定层次化索引各级别levels上的索引,必须设置keys外层级别的索引
names=None #创建分层索引级别levels的名称, 必须设置了keys
verify _integrity=False#是否允许重复索引 ,True如发现则引发异常。默认允许重复
ignore_index=False #不保留连接轴上的索引, 产生一组新索引range(total_length)
copy=True #副本
====================================================================
注意:
concat()制作数据副本,不断重复使用可能会产生重大的性能损失。
如需要对多个数据集使用该操作,请使用列表推导。
frames = [ process_your_file(f) for f in files ]
result = pd.concat(frames)
=============================================================
2.实例
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'], 'C': ['C0', 'C1', 'C2']})
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],'B': ['B3', 'B4', 'B5'],'C': ['C3', 'C4', 'C5']})
df3 = pd.DataFrame({'A': ['A6', 'A7', 'A8'],'B': ['B6', 'B7', 'B8'],'C': ['C6', 'C7', 'C8']})
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6'],'D': ['D2', 'D3', 'D6'],'F': ['F2', 'F3', 'F6']},index=[2,3,4])
# 实例1:axis轴选择
result = pd.concat([df1, df4], sort=False) #选择axis=0水平方向合并
result1 =pd.concat([df1, df4], axis=1, sort=False)#选择axis=1垂直方向合并
df1 A B C result result1
0 A0 B0 C0 A B C D F
1 A1 B1 C1 0 A0 B0 C0 NaN NaN A B C B D F
2 A2 B2 C2 1 A1 B1 C1 NaN NaN 0 A0 B0 C0 NaN NaN NaN
df4 B D F 2 A2 B2 C2 NaN NaN 1 A1 B1 C1 NaN NaN NaN
2 B2 D2 F2 2 NaN B2 NaN D2 F2 2 A2 B2 C2 B2 D2 F2
3 B3 D3 F3 3 NaN B3 NaN D3 F3 3 NaN NaN NaN B3 D3 F3
4 B6 D6 F6 4 NaN B6 NaN D6 F6 4 NaN NaN NaN B6 D6 F6
==========================================================
# 实例2:join 内连接或外连接
# 索引是按交集inner还是并集outer 进行合并;默认join='outer'排序,sort=False不进行排序
result = pd.concat([df1, df4], join='outer',sort=False) #默认外连接
result1 = pd.concat([df1, df4], join='inner',sort=False)#内连接
df1 A B C result result1
0 A0 B0 C0 A B C D F B
1 A1 B1 C1 0 A0 B0 C0 NaN NaN 0 B0
2 A2 B2 C2 1 A1 B1 C1 NaN NaN 1 B1
df4 B D F 2 A2 B2 C2 NaN NaN 2 B2
2 B2 D2 F2 2 NaN B2 NaN D2 F2 2 B2
3 B3 D3 F3 3 NaN B3 NaN D3 F3 3 B3
4 B6 D6 F6 4 NaN B6 NaN D6 F6 4 B6
===========================================================
# 实例3:join_axes选取数据都有的索引进行合并
pd.concat([df1, df4], axis=1, join_axes=[df1.index])
A B C B D F
0 A0 B0 C0 NaN NaN NaN
1 A1 B1 C1 NaN NaN NaN
2 A2 B2 C2 B2 D2 F2
pd.concat([df1, df4], join_axes=[df1.columns])
A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
2 NaN B2 NaN
3 NaN B3 NaN
4 NaN B6 NaN
=====================================================
# 实例4:keys行分层索引
frames = [df1, df2, df3]
piece={'x': df1, 'y': df2, 'z': df3}
result = pd.concat(frames)
result1 = pd.concat(frames, keys=['x', 'y', 'z'],names=['key1','key2'])#行分层索引
result1 = pd.concat( piece,names=['key1','key2']) #行分层索引等价上面
result1 = pd.concat(piece, keys=['x', 'y','z'], #可任意选取要合并的列,任意放置顺序
names=['key1','key2']) #行分层索引等价上面;names为分层索引名称
result1 = pd.concat(piece, keys=['x', 'y', 'z'],names=['key1','key2'], #行分层索引等价上面
levels=[['x', 'y', 'z', 'w']]) #levels中要完全包含keys的元素
result1.loc['y'] #选择块y,结果同df2
df1 A B C result result1
0 A0 B0 C0
1 A1 B1 C1 A B C key1 key2 A B C
2 A2 B2 C2 0 A0 B0 C0 x 0 A0 B0 C0
df2 A B C 1 A1 B1 C1 1 A1 B1 C1
0 A3 B3 C3 2 A2 B2 C2 2 A2 B2 C2
1 A4 B4 C4 0 A3 B3 C3 y 0 A3 B3 C3
2 A5 B5 C5 1 A4 B4 C4 1 A4 B4 C4
df3 A B C 2 A5 B5 C5 2 A5 B5 C5
0 A6 B6 C6 0 A6 B6 C6 z 0 A6 B6 C6
1 A7 B7 C7 1 A7 B7 C7 1 A7 B7 C7
2 A8 B8 C8 2 A8 B8 C8 2 A8 B8 C8
=====================================================
# 实例5:ignore_index忽略索引
result1 =pd.concat([df1, df4], sort=False)
result1 =df1.append(df4,sort=False) #等价上面
result2 =pd.concat([df1, df4], axis=0, sort=False, ignore_index=True)
result2 =df1.append(df4, ignore_index=True,sort=False)#等价上面
result3 =pd.concat([df1, df4], axis=1, sort=False)
result4 =pd.concat([df1, df4], axis=1, sort=False, ignore_index=True)
result1 result2 result3 result4
A B C D F A B C D F A B C B D F 0 1 2 3 4 5
0 A0 B0 C0 NaN NaN 0 A0 B0 C0 NaN NaN 0 A0 B0 C0 NaN NaN NaN 0 A0 B0 C0 NaN NaN NaN
1 A1 B1 C1 NaN NaN 1 A1 B1 C1 NaN NaN 1 A1 B1 C1 NaN NaN NaN 1 A1 B1 C1 NaN NaN NaN
2 A2 B2 C2 NaN NaN 2 A2 B2 C2 NaN NaN 2 A2 B2 C2 B2 D2 F2 2 A2 B2 C2 B2 D2 F2
2 NaN B2 NaN D2 F2 3 NaN B2 NaN D2 F2 3 NaN NaN NaN B3 D3 F3 3 NaN NaN NaN B3 D3 F3
3 NaN B3 NaN D3 F3 4 NaN B3 NaN D3 F3 4 NaN NaN NaN B6 D6 F6 4 NaN NaN NaN B6 D6 F6
4 NaN B6 NaN D6 F6 5 NaN B6 NaN D6 F6
=======================================================
# 实例6:verify_integrity索引重叠是否忽略
pd.concat(frames, verify_integrity=True)#忽略重叠索引
pd.concat(frames, verify_integrity=True)#ValueError索引具有重叠值
=======================================================
# 实例7:与序列连接
# 实例7.1:
s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])
result1=pd.concat([s1, s2])
result2=pd.concat([s1, s2],axis=1)
result3=pd.concat([s1, s2], keys=['s1', 's2',],names=['key1','key2'])
# result1 result2 result3
# key1 key2
# 0 a # s1 0 a
# 1 b # 0 1 # 1 b
# 0 c # 0 a c # s2 0 c
# 1 d # 1 b d # 1 d
=====================================================
# 实例7.2:
s1 = pd.Series(['X0', 'X1', 'X2'], name='X')
result = pd.concat([df1, s1,s1], axis=1)
A B C X X
0 A0 B0 C0 X0 X0
1 A1 B1 C1 X1 X1
2 A2 B2 C2 X2 X2
result = pd.concat([df1, s1])
A B C 0
0 A0 B0 C0 NaN
1 A1 B1 C1 NaN
2 A2 B2 C2 NaN
0 NaN NaN NaN X0
1 NaN NaN NaN X1
2 NaN NaN NaN X2
=========================================================
# 实例7.3:
s3 = pd.Series([0, 1, 2, 3], name='foo')
s4 = pd.Series([0, 1, 2, 3])
s5 = pd.Series([0, 1, 4, 5])
pd.concat([s3, s4, s5], axis=1)
foo 0 1
0 0 0 0
1 1 1 1
2 2 2 4
3 3 3 5
pd.concat([s3, s4, s5], axis=1, keys=['red','blue','yellow'])
red blue yellow
0 0 0 0
1 1 1 1
2 2 2 4
3 3 3 5