【发布时间】:2021-03-20 09:38:53
【问题描述】:
我有一个字典字典,每个字典都包含我数据框每一列的映射。
我的目标是找到最有效的方法来为我的 1 行 300 列的数据框执行映射。
我的数据框是从range(mapping_size)中随机抽样的;我的字典将值从range(mapping_size) 映射到random.randint(mapping_size+1,mapping_size*2)。
我可以从the answer provided by jpp 看到map 可能是最有效的方法,但我正在寻找比map 更快的方法。你能想到任何吗?如果输入的数据结构是其他东西而不是 pandas 数据框,我很高兴。
这是使用map 和replace 设置问题和结果的代码:
# import packages
import random
import pandas as pd
import numpy as np
import timeit
# specify paramters
ncol = 300 # number of columns
nrow = 1 #number of rows
mapping_size = 10 # length of each dictionary
# create a dictionary of dictionaries for mapping
mapping_dict = {}
random.seed(123)
for idx1 in range(ncol):
# create empty dictionary
mapping_dict['col_' + str(idx1)] = {}
for inx2 in range(mapping_size):
# create dictionary of length mapping_size and maps value from range(mapping_size) to random.randint(mapping_size +1 ,mapping_size*2)
mapping_dict['col_' + str(idx1)][inx2+1] = random.randint(mapping_size+1,mapping_size*2)
# Create a dataframe with values sampled from range(mapping_size)
d={}
random.seed(123)
for idx1 in range(ncol):
d['col_' + str(idx1)] = np.random.choice(range(mapping_size),nrow)
df = pd.DataFrame(data=d)
使用map 和replace 的结果:
%%timeit -n 20
df.replace(mapping_dict) #296 ms
%%timeit -n 20
for key in mapping_dict.keys():
df[key] = df[key].map(mapping_dict[key]).fillna(df[key]) #221ms
%%timeit -n 20
for key in mapping_dict.keys():
df[key] = df[key].map(mapping_dict[key]) #181ms
【问题讨论】:
标签: python pandas dictionary mapping