在运用pandas进行数据分析时,经常需要将Dataframe进行拼接、合并。
pandas提供的API主要包括:append、assign、join、merge、concat。
每个API的不同特点汇总如下:
| API | 拼接行 (变高) | 拼接列 (变宽) | 特点 |
| append | 是 | index重复无所谓,直接叠加 | |
| assign | 是 | 增加的列名(column name)无需加引号 | |
| join | 是 | 关键字(key): how: 4种,默认是原始数据(the calling Dataframe)的标签(left) | |
| merge | 是 | 关键字(key): how: 4种,默认是交集(inner) | |
| concat | 是 | 是 | axis: 默认是0,拼接行(变高) join: 2种,默认是并集(outer) |
append,是进行行(index)的拼接。
1、列标签(columns)一致代码如下:
np_array_1 = [[1,2,3],
[4,5,6]]
df1 = pd.Dataframe(data = np_array_1,
index=['甲','乙'],
columns=list('ABC'))
print(df1)
np_array_2 = [[7,8,9],
[10,11,12]]
df2 = pd.Dataframe(data = np_array_2,
index=['丙','丁'],
columns=list('ABC'))
print(df2)
df_append = df1.append(df2)
print(df_append)
运行结果:
A B C
甲 1 2 3
乙 4 5 6
A B C
丙 7 8 9
丁 10 11 12
A B C
甲 1 2 3
乙 4 5 6
丙 7 8 9
丁 10 11 12
在拼接时,可以通过写入参数(ignore_index=True),忽略原始index,形成新的index。
代码如下:
df_append = df1.append(df2,ignore_index=True) print(df_append)
运行结果(df_append 的index发生了变化):
A B C
甲 1 2 3
乙 4 5 6
A B C
丙 7 8 9
丁 10 11 12
A B C
0 1 2 3
1 4 5 6
2 7 8 9
3 10 11 12
2、列标签(columns)不一致
代码如下:
np_array_1 = [[1,2,3],
[4,5,6]]
df1 = pd.Dataframe(data = np_array_1,
index=['甲','乙'],
columns=list('ABC'))
print(df1)
np_array_2 = [[7,8,9],
[10,11,12]]
df2 = pd.Dataframe(data = np_array_2,
index=['丙','丁'],
columns=list('ABD'))
print(df2)
df_append = df1.append(df2)
print(df_append)
运行结果(以 NaN 填充):
A B C
甲 1 2 3
乙 4 5 6
A B D
丙 7 8 9
丁 10 11 12
A B C D
甲 1 2 3.0 NaN
乙 4 5 6.0 NaN
丙 7 8 NaN 9.0
丁 10 11 NaN 12.0
二、assign
assign,添加列(column)。
1、根据已有列(column)添加代码如下:
np_array = [[1,2,3],
[4,5,6],
[7,8,9]]
df = pd.Dataframe(data = np_array,
index=['甲','乙','丙'],
columns=list('ABC'))
print(df)
df_assign = df.assign(D=df['A'] *2)
print(df_assign)
运行结果:
A B C
甲 1 2 3
乙 4 5 6
丙 7 8 9
A B C D
甲 1 2 3 2
乙 4 5 6 8
丙 7 8 9 14
2、添加新列(column)
代码如下:
df_assign = df.assign(Name='Andy') print(df_assign)
运行结果:
A B C
甲 1 2 3
乙 4 5 6
丙 7 8 9
A B C Name
甲 1 2 3 Andy
乙 4 5 6 Andy
丙 7 8 9 Andy
三、join
join,添加列(columns)。
1、列标签(columns)无重叠 (1)how = left代码如下(默认left):
np_array_1 = [[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]]
df1 = pd.Dataframe(data = np_array_1,
index=['01收入','02成本','03收益','04利润'],
columns=['1月','2月','3月'])
print(df1)
np_array_2 = [[1,2,3],
[4,5,6]]
df2 = pd.Dataframe(data = np_array_2,
index=['01收入','03损失'],
columns=['4月','5月','6月'])
print(df2)
df_join = df1.join(df2)
print(df_join)
运行结果(以原始DF的index为准):
1月 2月 3月
01收入 1 2 3
02成本 4 5 6
03收益 7 8 9
04利润 10 11 12
4月 5月 6月
01收入 1 2 3
03损失 4 5 6
1月 2月 3月 4月 5月 6月
01收入 1 2 3 1.0 2.0 3.0
02成本 4 5 6 NaN NaN NaN
03收益 7 8 9 NaN NaN NaN
04利润 10 11 12 NaN NaN NaN
(2)how = right
代码如下(right):
df_join = df1.join(df2,how='right') print(df_join)
运行结果(以后续DF的index为准):
1月 2月 3月
01收入 1 2 3
02成本 4 5 6
03收益 7 8 9
04利润 10 11 12
4月 5月 6月
01收入 1 2 3
03损失 4 5 6
1月 2月 3月 4月 5月 6月
01收入 1.0 2.0 3.0 1 2 3
03损失 NaN NaN NaN 4 5 6
(3)how = outer
代码如下(outer):
df_join = df1.join(df2,how='outer') print(df_join)
运行结果(并集):
1月 2月 3月
01收入 1 2 3
02成本 4 5 6
03收益 7 8 9
04利润 10 11 12
4月 5月 6月
01收入 1 2 3
03损失 4 5 6
1月 2月 3月 4月 5月 6月
01收入 1.0 2.0 3.0 1.0 2.0 3.0
02成本 4.0 5.0 6.0 NaN NaN NaN
03损失 NaN NaN NaN 4.0 5.0 6.0
03收益 7.0 8.0 9.0 NaN NaN NaN
04利润 10.0 11.0 12.0 NaN NaN NaN
(4)how = inner
代码如下(inner):
df_join = df1.join(df2,how='inner') print(df_join)
运行结果(交集):
1月 2月 3月
01收入 1 2 3
02成本 4 5 6
03收益 7 8 9
04利润 10 11 12
4月 5月 6月
01收入 1 2 3
03损失 4 5 6
1月 2月 3月 4月 5月 6月
01收入 1 2 3 1 2 3
2、列标签(columns)有重叠
代码如下:
np_array_1 = [[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]]
df1 = pd.Dataframe(data = np_array_1,
index=['01收入','02成本','03收益','04利润'],
columns=['1月','2月','3月'])
print(df1)
np_array_2 = [[1,2,3],
[4,5,6]]
df2 = pd.Dataframe(data = np_array_2,
index=['01收入','03损失'],
columns=['3月','5月','6月'])
print(df2)
df_join = df1.join(df2,how='outer',lsuffix='_1',rsuffix='_2')
print(df_join)
运行结果(添加后缀suffix):
1月 2月 3月
01收入 1 2 3
02成本 4 5 6
03收益 7 8 9
04利润 10 11 12
3月 5月 6月
01收入 1 2 3
03损失 4 5 6
1月 2月 3月_1 3月_2 5月 6月
01收入 1.0 2.0 3.0 1.0 2.0 3.0
02成本 4.0 5.0 6.0 NaN NaN NaN
03损失 NaN NaN NaN 4.0 5.0 6.0
03收益 7.0 8.0 9.0 NaN NaN NaN
04利润 10.0 11.0 12.0 NaN NaN NaN
3、on 的应用
代码如下:
np_array_1 = [[1,2,'Andy_1'],
[4,5,6],
[7,8,'Andy_2'],
[10,11,12]]
df1 = pd.Dataframe(data = np_array_1,
index=['甲','乙','丙','丁'],
columns=list('ABC'))
print(df1)
np_array_2 = [[1,2,3],
[4,5,6]]
df2 = pd.Dataframe(data = np_array_2,
index=['Andy_1','Andy_2'],
columns=list('DEF'))
print(df2)
df_join = df1.join(df2,on='C')
print(df_join)
运行结果(以原始DF的列(column)作为关键字(key)):
A B C
甲 1 2 Andy_1
乙 4 5 6
丙 7 8 Andy_2
丁 10 11 12
D E F
Andy_1 1 2 3
Andy_2 4 5 6
A B C D E F
甲 1 2 Andy_1 1.0 2.0 3.0
乙 4 5 6 NaN NaN NaN
丙 7 8 Andy_2 4.0 5.0 6.0
丁 10 11 12 NaN NaN NaN



