Pandas利用主表更新子表指定列小技巧

 更新时间:2025年05月02日 11:07:50   作者:袁袁袁袁满  
本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同步操作,下面就来介绍一下,感兴趣的可以了解一下

一、前言

工作的小技巧,利用pandas读取主表和子表,利用主表的指定列,更新子表的指定列。

案例:

主表:
   uid name
0  101   小白
1  102   小红
2  103   小蓝

子表:
  name zb_uid
0   小白   None
1   小红   None
2   小绿   None

需求:主表的name列数据和子表name列数据数据相同时,将 主表对应的 uid 赋值给 子表的 zb_uid

二、基本案例

1. 创建主表数据

import pandas as pd

# 主表示例数据
data_sheet = {
    'uid': [101, 102, 103],
    'name': ['小白', '小红', '小蓝'],
}
df_sheet = pd.DataFrame(data_sheet)
print('主表:')
print(df_sheet)
  • data_sheet 是一个字典,其中键 'uid' 对应一个包含三个整数的列表,表示用户的唯一标识;键 'name' 对应一个包含三个字符串的列表,表示用户的姓名。
  • pd.DataFrame(data_sheet) 把 data_sheet 字典转换为 pandas 的 DataFrame 对象 df_sheetDataFrame 是一种二维表格型数据结构,类似于电子表格或 SQL 表。
  • 最后通过 print 函数打印出主表的内容。

2. 创建映射字典

# 创建一个映射字典,将 name 映射到 uid
name_uid_map = df_sheet.set_index('name')['uid'].to_dict()
print('映射字典:',name_uid_map)
  • df_sheet.set_index('name') 把 df_sheet 的 'name' 列设置为索引,这样就可以通过姓名来定位对应的行。
  • ['uid'] 选取 uid 列的数据。
  • to_dict() 把选取的数据转换为字典,字典的键是姓名,值是对应的 uid
  • 最后通过 print 函数打印出这个映射字典。

3. 创建子表数据

# 子表示例数据
data_sheet1 = {
    'name': ['小白', '小红', '小绿'],
    'zb_uid': [None,None,None]
}
df_sheet1 = pd.DataFrame(data_sheet1)
print('子表:')
print(df_sheet1)
  • data_sheet1 是一个字典,键 'name' 对应一个包含三个字符串的列表,表示用户姓名;键 'zb_uid' 对应一个包含三个 None 值的列表,这里 zb_uid 初始值都为空,后续会进行更新。
  • pd.DataFrame(data_sheet1) 将 data_sheet1 字典转换为 DataFrame 对象 df_sheet1
  • 最后通过 print 函数打印出子表的内容。

4. 更新子表的 zb_uid 列

# 更新子表的 zb_uid 列
df_sheet1['zb_uid'] = df_sheet1['name'].map(name_uid_map).fillna(df_sheet1['zb_uid'])
  • df_sheet1['name'].map(name_uid_map) 会根据 name_uid_map 字典,将 df_sheet1 中 'name' 列的每个值映射为对应的 uid。如果 'name' 列的值在 name_uid_map 字典中不存在,就会映射为 NaN
  • fillna(df_sheet1['zb_uid']) 把映射结果中的 NaN 值用 df_sheet1 中原来的 'zb_uid' 列的值填充。这里由于 zb_uid 初始值为 None,在 pandas 中会被视为 NaN,所以实际操作就是保留原来的 NaN 值。
  • 最后把更新后的值赋给 df_sheet1 的 'zb_uid' 列。

5. 完整代码

import pandas as pd


# 主表示例数据
data_sheet = {
    'uid': [101, 102, 103],
    'name': ['小白', '小红', '小蓝'],
}
df_sheet = pd.DataFrame(data_sheet)
print('主表:')
print(df_sheet)
# 创建一个映射字典,将 name 映射到 uid
name_uid_map = df_sheet.set_index('name')['uid'].to_dict()
print('映射字典:',name_uid_map)


# 子表示例数据
data_sheet1 = {
    'name': ['小白', '小红', '小绿'],
    'zb_uid': [None,None,None]
}
df_sheet1 = pd.DataFrame(data_sheet1)
print('子表:')
print(df_sheet1)

# 更新子表的 zb_uid 列
df_sheet1['zb_uid'] = df_sheet1['name'].map(name_uid_map).fillna(df_sheet1['zb_uid'])

print("更新后的子表:")
print(df_sheet1)

运行结果:

主表:
   uid name
0  101   小白
1  102   小红
2  103   小蓝
子表:
  name zb_uid
0   小白   None
1   小红   None
2   小绿   None
映射字典: {'小白': 101, '小红': 102, '小蓝': 103}
更新后的子表:
  name  zb_uid
0   小白   101.0
1   小红   102.0
2   小绿     NaN

6. 总结

这段代码的主要功能是根据主表中姓名和 uid 的对应关系,更新子表中 zb_uid 列的值。如果子表中的姓名在主表中存在,就用对应的 uid 填充 zb_uid;如果不存在,则保持 zb_uid 为空。

三、升级案例

在基本案例的基础上,根据名字和拼音的映射字典,更新主表和子表的name字段:

import pandas as pd


def get_namePingyingMap():
	// 下面方式是手动建映射字典,当然如果你有数据库也可以从数据库读取然后建映射字典
    name_pingying_map = {'小白':'xiaobai','小红':'xiaohong','小蓝':'xiaolan','小绿':'xiaolù'}
    print('name_pingying_map映射字典:', name_pingying_map)

    return name_pingying_map


# 主表示例数据
data_sheet = {
    'uid': [101, 102, 103],
    'name': ['小白', '小红', '小蓝'],
}
df_sheet = pd.DataFrame(data_sheet)
print('主表:')
print(df_sheet)
# 更新主表的 name 列
name_pingying_map = get_namePingyingMap()
df_sheet['name'] = df_sheet['name'].map(name_pingying_map).fillna(df_sheet['name'])
print("更新后的主表:")
print(df_sheet)
# 创建一个映射字典,将 name 映射到 uid
name_uid_map = df_sheet.set_index('name')['uid'].to_dict()
print('name_uid_map映射字典:',name_uid_map)

# 子表示例数据
data_sheet1 = {
    'name': ['小白', '小红', '小绿'],
    'zb_uid': [None,None,None]
}
df_sheet1 = pd.DataFrame(data_sheet1)
print('子表:')
print(df_sheet1)

# 更新子表的 name 列
df_sheet1['name'] = df_sheet1['name'].map(name_pingying_map).fillna(df_sheet1['name'])
# 更新子表的 zb_uid 列
df_sheet1['zb_uid'] = df_sheet1['name'].map(name_uid_map).fillna(df_sheet1['zb_uid'])

print("更新后的子表:")
print(df_sheet1)

运行结果:

主表:
   uid name
0  101   小白
1  102   小红
2  103   小蓝
name_pingying_map映射字典: {'小白': 'xiaobai', '小红': 'xiaohong', '小蓝': 'xiaolan', '小绿': 'xiaolù'}
更新后的主表:
   uid      name
0  101   xiaobai
1  102  xiaohong
2  103   xiaolan
name_uid_map映射字典: {'xiaobai': 101, 'xiaohong': 102, 'xiaolan': 103}
子表:
  name zb_uid
0   小白   None
1   小红   None
2   小绿   None
更新后的子表:
       name  zb_uid
0   xiaobai   101.0
1  xiaohong   102.0
2    xiaolù     NaN

到此这篇关于Pandas利用主表更新子表指定列小技巧的文章就介绍到这了,更多相关Pandas 更新子表指定列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Python处理JSON文件的完整流程(读取、解析、修改和保存)

    Python处理JSON文件的完整流程(读取、解析、修改和保存)

    JSON是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成,以下是 JSON 文件的完整定义方法和规范,本文还介绍了使用Python处理JSON文件的完整流程,包括读取、解析、修改和保存JSON数据的方法,需要的朋友可以参考下
    2025-11-11
  • Python实现读取.nc数据并提取指定时间与经纬度维度对应的变量数值

    Python实现读取.nc数据并提取指定时间与经纬度维度对应的变量数值

    这篇文章主要为大家详细介绍了如何使用Python语言的netCDF4库实现读取.nc格式的数据文件,并提取指定维(时间、经度与纬度)下的变量数据,需要的可以了解下
    2024-02-02
  • Python flask框架实现浏览器点击自定义跳转页面

    Python flask框架实现浏览器点击自定义跳转页面

    这篇文章主要介绍了Python flask框架实现浏览器点击自定义跳转页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python跳出多重循环的方法示例

    Python跳出多重循环的方法示例

    这篇文章主要介绍了Python跳出多重循环的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python从Excel读取数据并使用Matplotlib绘制成二维图像

    Python从Excel读取数据并使用Matplotlib绘制成二维图像

    本课程实现使用 Python 从 Excel 读取数据,并使用 Matplotlib 绘制成二维图像。这一过程中,将通过一系列操作来美化图像,最终得到一个可以出版级别的图像。本课程对于需要书写实验报告,学位论文,发表文章,做报告的学员具有较大价值
    2023-02-02
  • Python+SimpleRNN实现股票预测详解

    Python+SimpleRNN实现股票预测详解

    这篇文章主要为大家详细介绍了如何利用Python和SimpleRNN实现股票预测效果,文中的示例代码讲解详细,对我们学习有一定帮助,需要的可以参考一下
    2022-05-05
  • Python简单读取json文件功能示例

    Python简单读取json文件功能示例

    这篇文章主要介绍了Python简单读取json文件功能,结合实例形式分析了Python文件读取及json格式数据相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Python使用read_csv读数据遇到分隔符问题的2种解决方式

    Python使用read_csv读数据遇到分隔符问题的2种解决方式

    read.csv()可以从带分隔符的文本文件中导入数据,下面这篇文章主要给大家介绍了关于Python使用read_csv读数据遇到分隔符问题的2种解决方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 使用matplotlib修改坐标轴,将y轴的间距设置为某一个值

    使用matplotlib修改坐标轴,将y轴的间距设置为某一个值

    这篇文章主要介绍了使用matplotlib修改坐标轴,将y轴的间距设置为某一个值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • CentOS下安装python3.7全过程

    CentOS下安装python3.7全过程

    文章详细介绍了如何在Linux系统上从源码编译并安装Python 3.7,并解决了一些常见的安装问题,如依赖包缺失、模块未找到等,同时,还介绍了如何将新安装的Python 3设置为默认Python,并确保yum等系统工具能够正常使用Python 3
    2026-01-01

最新评论