#为了方便后面的演示,这里定义一个能够快速创建DataFrame的函数
import numpy as np
import pandas as pd
def make_df(cols, index):
"""一个简单的DataFrame"""
data = {c:[str(c)+str(i) for i in index] for c in cols}
return pd.DataFrame(data, index)
#通过pd.concat对Series实现合并
ser1 = pd.Series(['A', 'B', 'C'], index=[1,2,3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4,5,6])
pd.concat([ser1, ser2])
Out[111]:
1 A
2 B
3 C
4 D
5 E
6 F
dtype: object
#通过pd.concat对DataFrame实现合并
df1 = make_df('AB', [1,2])
df2 = make_df('AB', [3,4])
print(df1);print(df2); print(pd.concat([df1,df2]))
#输入如下:
A B
1 A1 B1
2 A2 B2
A B
3 A3 B3
4 A4 B4
A B
1 A1 B1
2 A2 B2
3 A3 B3
4 A4 B4
实际应用中涉及的数据源并不会像上面举的两个例子一样简单。如果对复杂的数据源使用pd.concat()方法会出现下面两种需要解决的问题
df3 = make_df('AB', [0,1])
df4 = make_df('AB', [0,1])
print(df3);print(df4); print(pd.concat([df3,df4]))
#输出结果:
A B
0 A0 B0
1 A1 B1
A B
0 A0 B0
1 A1 B1
A B
0 A0 B0
1 A1 B1
0 A0 B0
1 A1 B1
输出结果中合并之后的DataFrame保留了合并前两个成员的各自的索引,而这样重复的索引不是我们想要的。如果结果中的索引无关紧要,可以设置ignore_index参数来实现,如果将参数设为True,那么合并时将创建一个新的整数索引。
print(pd.concat([df3,df4]), ignore_index=True)
#输出结果
A B
0 A0 B0
1 A1 B1
2 A0 B0
3 A1 B1
另外一种解决索引重复的方法是通过keys参数为数据源设置多级索引标签,这样结果数据就会带上多级索引:
print(pd.concat([df3,df4], keys=['x', 'y']))
#输出结果:
A B
x 0 A0 B0
1 A1 B1
y 0 A0 B0
1 A1 B1
df5 = make_df('ABC', [1,2])
df6 = make_df('BCD', [3,4])
print(df5);print(df6);print(pd.concat([df5,df6]))
#输出结果:
A B C D
1 A1 B1 C1 NaN
2 A2 B2 C2 NaN
3 NaN B3 C3 D3
4 NaN B4 C4 D4
默认情况下,某个位置上缺失的数据会用NaN表示,如果不想这样,可以用join和join_axes参数设置合并方式。默认的合并方式是对所有输入列进行并集合并(join=’outter’),当然也可以用join=’inner’实现对输入列的交集合并:
print(pd.concat([df5,df6],join='inner'))
#输出结果:
B C
1 B1 C1
2 B2 C2
3 B3 C3
4 B4 C4
另外一种合并方式是直接确定使用的列名,设置join_axes 参数,里面是索引对象构成的列表(是列表的列表)。如下面示例所示,将结果的列名设置为第一个输入的列名:
print(pd.concat([df5,df6], join_axes=[df5.columns]))
#输出结果:
A B C
1 A1 B1 C1
2 A2 B2 C2
3 NaN B3 C3
4 NaN B4 C4