目录

1、pd.merge(left, right, how='inner')

2、pd.concat([left,right],axis=1,join='inner’)

a、根据行索引进行连接(两表所有列横向堆叠)

b、根据列索引进行连接(两表所有行纵向堆叠)

3、df_left.join(df_right)

a、根据行索引进行连接(两表所有列横向堆叠)

b、根据列索引进行连接(两表所有列横向堆叠)

4、df.append([df1, df2...])

a、添加DataFrame表

b、添加Series序列


1、pd.merge(left, right, how='inner')

  • left:指定需要连接的主表
  • right:指定需要连接的辅表
  • on: 用于连接的列名
  • how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer

根据指定列进行连接:

import pandas as pd

list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c'])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])

# 左连接 --左表全要,右表与之匹配
print(pd.merge(df1, df2, on='姓名', how='left'))
# 右连接 --右表全要,左表与之匹配
print(pd.merge(df1, df2, on='姓名', how='right'))
# 内连接 --只有共有部分匹配
print(pd.merge(df1, df2, on='姓名', how='inner'))
# 外连接 --先将共有部分匹配,再将独有部分缺少数据填充空堆叠
print(pd.merge(df1, df2, on='姓名', how='outer'))
​

运行结果:

左连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23 下棋 游泳
1 钱二 27 游泳 NaN
2 孙三 26 唱歌 NaN

右连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23.0 下棋 游泳
1 李四 NaN NaN 唱歌
2 周五 NaN NaN 下棋

内连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23 下棋 游泳

外连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23.0 下棋 游泳
1 钱二 27.0 游泳 NaN
2 孙三 26.0 唱歌 NaN
3 李四 NaN NaN 唱歌
4 周五 NaN NaN 下棋

2、pd.concat([left,right],axis=1,join='inner’)

  • left:指定需要连接的主
  • right:指定需要连接的辅表
  • axis::axis =1用于横向,axis =0代表纵向(默认为0)
  • join:指定连接方式,只有outer,inner 两种
  • ignore_index:如果为True,不使用并重置轴上的索引值。结果轴将被标记为0,...,n-1。
  • keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。

a、根据行索引进行连接(两表所有列横向堆叠)

import pandas as pd

list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])

# axis =1用于横向
print(pd.concat([df1, df2], axis=1))
# 内连接  --只有index相同的匹配
print(pd.concat([df1, df2], axis=1, join='inner'))
# 外连接  --先将index相同的匹配, 再将独有部分缺少数据填充空堆叠
print(pd.concat([df1, df2], axis=1, join='outer'))

运行结果:

纵向:
姓名 年龄 性别 姓名 爱好
1 赵一 23.0 男 赵一 游泳
2 NaN NaN NaN 李四 唱歌
3 NaN NaN NaN 周五 下棋
4 钱二 27.0 女 NaN NaN
5 孙三 26.0 女 NaN NaN

纵向内连接:(两表中index相同的行)
姓名 年龄 性别 姓名 爱好
1 赵一 23 男 赵一 游泳

纵向外连接:(两表中i所有行)
姓名 年龄 性别 姓名 爱好
1 赵一 23.0 男 赵一 游泳
2 NaN NaN NaN 李四 唱歌
3 NaN NaN NaN 周五 下棋
4 钱二 27.0 女 NaN NaN
5 孙三 26.0 女 NaN NaN

b、根据列索引进行连接(两表所有行纵向堆叠)

import pandas as pd

list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])

# axis =0代表纵向
print(pd.concat([df1, df2], axis=0))
# 内连接  --只有column相同的匹配
print(pd.concat([df1, df2], axis=0, join='inner'))
# 外链接  --先将column相同的匹配,再将独有部分缺少数据填充空堆叠
print(pd.concat([df1, df2], axis=0, join='outer'))

运行结果:

纵向:
姓名 年龄 性别 爱好
1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋

纵向内连接:(两表中共同的列)
姓名
1 赵一
4 钱二
5 孙三
1 赵一
2 李四
3 周五

纵向外连接:(两表中所有的列)
姓名 年龄 性别 爱好
1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋

注:

i、连接后的表包含df1.index和df2.index,可利用ignore_index = True重新定义新的行索引index

print(pd.concat([df1, df2], axis=0, ignore_index=True))

运行结果:

姓名 年龄 性别 爱好
0 赵一 23.0 男 NaN
1 钱二 27.0 女 NaN
2 孙三 26.0 女 NaN
3 赵一 NaN NaN 游泳
4 李四 NaN NaN 唱歌
5 周五 NaN NaN 下棋

ii、如果先知道如何

  • keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。
print(pd.concat([df1, df2], axis=0, keys=['df1', 'df2']))

运行结果:

姓名 年龄 性别 爱好
df1 1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
df2 1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋

3、df_left.join(df_right)

a、根据行索引进行连接(两表所有列横向堆叠)

import pandas as pd

list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['1', '游泳'], ['2', '唱歌'], ['5', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['工号', '爱好'], index=[1, 2, 5])
# 两表中index相同的匹配,没有相同的列名
print(df1.join(df2))
print(df1.join(df2, how='outer'))
print(df1.join(df2, how='inner'))

运行结果:

姓名 年龄 性别 工号 爱好
1 赵一 23 男 1 游泳
4 钱二 27 女 NaN NaN
5 孙三 26 女 5 下棋

姓名 年龄 性别 工号 爱好
1 赵一 23.0 男 1 游泳
2 NaN NaN NaN 2 唱歌
4 钱二 27.0 女 NaN NaN
5 孙三 26.0 女 5 下棋

姓名 年龄 性别 工号 爱好
1 赵一 23 男 1 游泳
5 孙三 26 女 5 下棋

b、根据列索引进行连接(两表所有列横向堆叠)

import pandas as pd

list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])

# 根据‘姓名’列进行匹配,lsuffix, rsuffix:在相同变量名后增加后缀,便于区分
print(df1.join(df2, lsuffix='_1', rsuffix='_2'))
# 先将右表‘姓名’列设置为行索引,再与左表的‘姓名’列匹配
print(df1.join(df2.set_index('姓名'), on='姓名'))
# 两表先将‘姓名’列设置为行索引,再进行join连接
print(df1.set_index('姓名').join(df2.set_index('姓名')))

运行结果:

姓名_1 年龄 性别 姓名_2 爱好
1 赵一 23 男 赵一 游泳
4 钱二 27 女 NaN NaN
5 孙三 26 女 NaN NaN

姓名 年龄 性别 爱好
1 赵一 23 男 游泳
4 钱二 27 女 NaN
5 孙三 26 女 NaN

年龄 性别 爱好
姓名
赵一 23 男 游泳
钱二 27 女 NaN
孙三 26 女 NaN

4、df.append([df1, df2...])

a、添加DataFrame表

import pandas as pd

list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])

res = df1.append(df2)
print(res)

运行结果:

姓名 年龄 性别 爱好
1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋

b、添加Series序列

import pandas as pd

list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
s1 = pd.Series(['李四', 30, '男'], index=['姓名', '年龄', '性别'], name=7)
# 注: Can only append a Series if ignore_index=True or if the Series has a name
res = df1.append(s1)
print(res)

运行结果:

姓名 年龄 性别
1 赵一 23 男
4 钱二 27 女
5 孙三 26 女
7 李四 30 男
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐