2017-10-13 57 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

@蘭嗨,並不總是我噸變化,但是我是可以找到字符串的最大數量在這種情況下,從數據框的'名稱'列將使用全部呢? –