IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python学习 --DataFrame连接: merge、concat、join、append -> 正文阅读

[Python知识库]python学习 --DataFrame连接: merge、concat、join、append

目录

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 男
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:21:06  更:2021-11-10 12:21:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:03:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码