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. 創(chuàng)建主表數據
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. 創(chuàng)建映射字典
# 創(chuàng)建一個映射字典,將 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. 創(chuàng)建子表數據
# 子表示例數據
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初始值都為空,后續(xù)會進行更新。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)
# 創(chuàng)建一個映射字典,將 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)
# 創(chuàng)建一個映射字典,將 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 更新子表指定列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python socket網絡編程TCP/IP服務器與客戶端通信
這篇文章主要介紹了Python socket網絡編程TCP/IP服務器與客戶端通信的相關資料,這里對Scoket 進行詳解并創(chuàng)建TCP服務器及TCP 客戶端實例代碼,需要的朋友可以參考下2017-01-01
Python迭代器iterator生成器generator使用解析
這篇文章主要介紹了Python迭代器iterator生成器generator使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
pytorch中的nn.ZeroPad2d()零填充函數實例詳解
這篇文章主要介紹了pytorch中的nn.ZeroPad2d()零填充函數實例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

