/ / Otimize a interseção entre a lista e as chaves de dicionário realmente grandes - python-3.x, pandas, dicionário

Otimize a interseção entre a lista e as chaves de dicionário realmente grandes - python-3.x, pandas, dicionário

Tenho que processar uma coluna de um quadro de dados que tem aproximadamente um tamanho de 15k a 20k. Tenho que processar a coluna "nome" nela para a qual chamei df.apply

df["bew_col"]=df.apply(lambda row: valuation_formula(row["persons_name"]), axis=1)

def valuation_formula(name_str):

flag="UNMAPPED"
sr=name_str.split(" ")
f=list(set(sr).intersection(set(name_dict.keys())))
# print (f)
if len(f)>0:
flag=name_dict[str(f[0])]
# print flag

return flag

my name_dict é um dicionário com 5 milhões de chaves.Como posso otimizar meu código para fazer uma interseção eficiente de uma lista de strings (que seria pequena, portanto, não é um caso de preocupação) com as chaves neste enorme dicionário para retornar o valor correspondente para a chave correspondida?

posso usar qualquer outra estrutura de dados?

agora, o script leva 20 minutos para ser executado. com tamanho de df de 10k e tamanho de name_dict de 3 milhões.

Respostas:

0 para resposta № 1

experimentar .str e map:

names_series = df["persons_name"]
name_mapping = None

while True:
name_series = name_series.str.partition()
mapping = name_series[0].map(name_dict)
if name_mapping is None:
name_mapping = mapping
else:
name_mapping[name_mapping.isnull() & (~mapping.isnull())]=mapping
name_series = name_series[2]
if name_series.str.len().sum()==0:
break

name_series[name_series.isnull()] = "UNMAPPED"
df["bew_col"] = name_series