如何基于Volume ID将DataFrame中列表类型列的值替换为另一个DataFrame的列值
解决方法:用字典映射快速替换Volume ID为对应Size
嘿,刚巧我之前也处理过类似的需求,给你分享个简单高效的做法,分两步就能搞定:
1. 先创建Volume ID到Size的映射字典
首先把df2转换成一个以VolumeID为键、size为值的字典,这样查找起来速度超快,尤其是数据量大的时候比用merge或者循环遍历效率高多了:
import pandas as pd # 先构造你的示例数据(这里我调整了部分ID让它们能匹配上) df1_data = { 'instance_id': ['i-0c314bb8d450cvv95', 'i-064e75dvdb8fb8d75', 'i-04a85cb1dccvd895b', 'i-0572cvvdf430d7475', 'i-0fe4cbbfsfgb51c14'], 'disks': [ ['vol-08662a47184e0b3b3', 'vol-07a18ce1652ff88f3'], ['vol-0f2911a1d0b9a521e', 'vol-0c28d13ada32564da'], ['vol-069bf62bf82f32402', 'vol-0424a5deb55024a47'], ['vol-0e3b471dcbf0fbd47', 'vol-003d7443d8696a691'], ['vol-0bcf2aa4f873cc296', 'vol-03d2a0f318973aaec'] ] } df1 = pd.DataFrame(df1_data) df2_data = { 'VolumeID': ['vol-02d8942df26543361', 'vol-0bcf2aa4f873cc296', 'vol-069bf62bf82f32402', 'vol-0424a5deb55024a47', 'vol-0871a4e6f387db693'], 'instance_id': ['i-0533ae59fgt06cb7a', 'i-0fe4cbbfsfgb51c14', 'i-04a85cb1dccvd895b', 'i-04a85cb1dccvd895b', 'i-0f2ae964gfdgf3caa'], 'size': [37, 450, 50, 150, 50], 'type': ['gp3', 'st1', 'gp3', 'st1', 'gp3'] } df2 = pd.DataFrame(df2_data) # 创建映射字典 volume_size_map = df2.set_index('VolumeID')['size'].to_dict()
2. 批量替换df1中的Volume ID为Size
接下来用apply函数遍历df1的disks列,把每个列表里的Volume ID替换成对应的Size,最后转成你想要的空格分隔字符串:
# 替换并转成空格分隔的字符串 df1['disks'] = df1['disks'].apply(lambda x: ' '.join(str(volume_size_map.get(vol, 'N/A')) for vol in x)) # 查看最终结果 print(df1)
运行后你会得到类似这样的结果(找不到匹配的Volume ID会显示N/A,你可以改成自己需要的默认值,比如0或者空字符串):
instance_id disks 0 i-0c314bb8d450cvv95 N/A N/A 1 i-064e75dvdb8fb8d75 N/A N/A 2 i-04a85cb1dccvd895b 50 150 3 i-0572cvvdf430d7475 N/A N/A 4 i-0fe4cbbfsfgb51c14 450 N/A
如果想保留列表形式而不是字符串,只需要把join去掉就行:
df1['disks'] = df1['disks'].apply(lambda x: [volume_size_map.get(vol, 'N/A') for vol in x])
这个方法的好处是简单直接,而且处理大数据集的时候性能也不错,比用merge然后再聚合要高效得多~
内容的提问来源于stack exchange,提问作者Abdullah BASARAN
相关产品推荐
相关产品推荐

