3.7合并数据集:Concat与Append操作3.7 合并数据集:Concat与Append操作
经常需要将不同的数据源进⾏合并,pd中有函数提供⽅便。
import numpy as np
import pandas as pd
简单起见,先定义⼀个能创建DF数据的函数:
def make_df(cols, ind):
"""快速创建 DataFrame"""
data = {c: [str(c) + str(i) for i in ind]
for c in cols}
return pd.DataFrame(data, ind)
# 例⼦ DataFrame
make_df('ABC', range(3))
A B C
0A0B0C0
1A1B1C1
2A2B2C2
定义⼀个display类,⽤于⽅便地并列显⽰数据:
class display(object):
"""Display HTML representation of multiple objects"""
template = """<div >
<p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}
def __init__(self, *args):
self.args = args
def _repr_html_(self):
return '\n'.plate.format(a, eval(a)._repr_html_())
for a in self.args)
def __repr__(self):
return '\n\n'.join(a + '\n' + repr(eval(a))
for a in self.args)
3.7.1 回顾np数组的合并
np数组可⽤函数 np.concatenate 进⾏合并:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
第⼀个参数是需要合并的数组列表或元组,还有⼀个axis参数可以设置合并的坐标轴⽅向:x = [[1, 2],
[3, 4]]
python数组合并
[3, 4],
[1, 2],
[3, 4]])
array([[1, 2, 1, 2],
[3, 4, 3, 4]])
3.7.2 通过pd.concat实现简易合并
pd有函数 pd.concat() 与前述np的函数 np.concatenate 语法类似,但是配置参数更多,功能也更强⼤:
# Signature in Pandas v0.18
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
concat可以简单地合并⼀维Series或DF对象,与np的concatenate合并数组⼀样:
ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])
1    A
2    B
3    C
4    D
5    E
6    F
dtype: object
也可⽤来合并⾼维数据,如下⾯的DF:
df1 = make_df('AB', [1, 2])
df2 = make_df('AB', [3, 4])
display('df1', 'df2', 'pd.concat([df1, df2])')
df1
A B
1A1B1
2A2B2
A B
df2
A B
3A3B3
4A4B4
A B
1A1B1
2A2B2
3A3B3
4A4B4
默认情况下DF的合并都是逐⾏进⾏的,即默认设置 axis=0 。concat也可以设置合并坐标轴,如:
df3 = make_df('AB', [0, 1])
df4 = make_df('CD', [0, 1])
display('df3', 'df4', "pd.concat([df3, df4], axis=1)")
df3
A B
0A0B0
1A1B1
df4
C D
0C0D0
1C1D1
A B C D 0A0B0C0D0 1A1B1C1D1索引重复
pd与np在合并函数上的主要差异就是,pd在合并时会保留索引,即使索引是重复的,依然保留,如:
x = make_df('AB', [0, 1])
y = make_df('AB', [2, 3])
y.index = x.index  # 复制索引
display('x', 'y', 'pd.concat([x, y])')
x
A B
0A0B0
1A1B1
y
A B
0A2B2
1A3B3
A B
0A0B0
1A1B1
0A2B2
1A3B3
如果不想要重复的索引,有如下办法:
1 捕捉索引重复的错误。可设置参数verify_integrity为True,合并时如果有重复索引则引发异常:
try:
except ValueError as e:
print("ValueError:", e)
ValueError: Indexes have overlapping values: Int64Index([0, 1], dtype='int64')
2 忽略索引。有时索引⽆关紧要,那么合并时就可忽略之,设置参数ignore_index为True即可,此时合并时会创建⼀个新的整数索
引,⽽将旧索引丢弃:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。