2017-10-13 60 views
0

我必须处理大小约为15k到20K的数据框的列。我必须处理它的列“名”的,我已经叫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 

我name_dict是500万个键的字典。我该如何优化我的代码,以便在这个巨大的字典中使用键来返回相匹配的键的相应值,从而实现字符串列表的高效交集(这将是小的,因此不是担心的情况)?

我可以使用任何其他数据结构吗?

现在脚本需要20分钟才能运行。 df大小为10k,name_dict大小为300万。

回答

0

尝试.strmap

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 
+0

谢谢您的回答,但我不能执行该语句name_series DF = [ 'persons_name'] str.partition(”“)[0]直接作为那么只有第一。这个字符串的名字将会被考虑(例如Oshin Sanjay Patwa),它将只映射为Oshin,而不是'Sanjay''Patwa',我想检查name_dict.keys()中字符串中所有单词的字符串,所以我可以在我的valuation_formula函数中使用map函数:f = list(set(sr).map(name_dict.keys())。谢谢你的建议! –

+0

@Oshin Patwa,名字总是少于3? – Ian

+0

@兰嗨,并不总是我吨变化,但是我是可以找到字符串的最大数量在这种情况下,从数据框的'名称'列将使用全部呢? –