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

Written by

in

文章目录
  • 工作的小技巧,利用pandas读取主表和子表,利用主表的指定列,更新子表的指定列。 案例: 主表:   uid name0  101   小白1  102   小红2  103   小蓝 子表:  name zb_uid0   小白   None1   小红   None2   小绿   None 需求:主表的name列数据和子表name列数据数据相同时,将 主表对应的 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 name0  101   小白1  102   小红2  103   小蓝name_pingying_map映射字典: {'小白': 'xiaobai', '小红': 'xiaohong', '小蓝': 'xiaolan', '小绿': 'xiaolù'}更新后的主表:   uid      name0  101   xiaobai1  102  xiaohong2  103   xiaolanname_uid_map映射字典: {'xiaobai': 101, 'xiaohong': 102, 'xiaolan': 103}子表:  name zb_uid0   小白   None1   小红   None2   小绿   None更新后的子表:       name  zb_uid0   xiaobai   101.01  xiaohong   102.02    xiaolù     NaN 到此这篇关于Pandas利用主表更新子表指定列小技巧的文章就介绍到这了,更多相关Pandas 更新子表指定列内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: 如何使用 Python Pandas 更新行和列
  • 目录
    • 一、前言
    • 二、基本案例
      • 1. 创建主表数据
      • 2. 创建映射字典
      • 3. 创建子表数据
      • 4. 更新子表的 zb_uid 列
      • 5. 完整代码
      • 6. 总结
    • 三、升级案例

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

      案例:

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

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

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

      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 函数打印出主表的内容。

      # 创建一个映射字典,将 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 函数打印出这个映射字典。

      # 子表示例数据
      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 函数打印出子表的内容。

      # 更新子表的 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' 列。

      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

      这段代码的主要功能是根据主表中姓名和 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 Pandas 更新行和列

      站内搜索