Pandas利用主表更新子表指定列小技巧
一、前言
工作的小技巧,利用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_sheet
。dataframe
是一种二维表格型数据结构,类似于电子表格或 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如何快速精准抓取网页数据
本文将使用requests和beautifulsoup这两个流行的库来实现。1.准备工作首先安装必要的库:pipinst...
-
使用Python实现IP地址和端口状态检测与监控
-
基于Python打造一个智能单词管理神器
-
Python实现微信自动锁定工具
-
使用Python创建一个功能完整的Windows风格计算器程序
python实现windows系统计算器程序(含高级功能)下面我将介绍如何使用python创建一个功能完整的windows风格计...
-
Python开发文字版随机事件游戏的项目实例
随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型。在这类游戏中,玩家必须应对随机发生的情况,这些情况可能会影响他们的资...
-
使用Pandas实现Excel中的数据透视表的项目实践
引言在数据分析中,数据透视表是一种非常强大的工具,它可以帮助我们快速汇总、分析和可视化大量数据。虽然excel提供了内置的数据透...
-
Pandas中统计汇总可视化函数plot()的使用
-
Python中tensorflow的argmax()函数的使用小结
在tensorflow中,argmax()函数是一个非常重要的操作,它用于返回给定张量(tensor)沿指定轴的最大值的索引。这个...
-
Python中模块graphviz使用入门