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字典转换为pandasdataframe对象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 更新子表指定列内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

发布于 2025-05-07 22:42:30
分享
海报
110
上一篇:Pandas中统计汇总可视化函数plot()的使用 下一篇:使用Pandas实现Excel中的数据透视表的项目实践
目录

    忘记密码?

    图形验证码