在运用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)的拼接。
代码如下:
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
代码如下:
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,添加列(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
代码如下:
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,添加列(columns)。
代码如下(默认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
代码如下(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
代码如下(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
代码如下(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
代码如下:
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
代码如下:
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