2017-03-01 42 views
1

我有writter以下功能:布爾函數被應用到數據幀與For循環

def extract_id(df, col): 

column = df[col] 
placement_extract = column.str.extract('(\d{14})', expand=True) 

for placement in column: 
    if placement in placement_extract == True: 
     return placement_extract 
    else: 
     return 'False' 

atlas_df['test'] = extract_id(atlas_df, 'PlacementName') 

當我申請,雖然,我得到一個錯誤

ValueError: cannot convert float NaN to integer 

我想怎麼辦是應用函數,如果提取是真的那個位置(行),然後給我14個數字。如果不是,則返回False一詞。

有人可以幫忙嗎?

最佳,

中號

+0

您的數據可能是具有NaN值,要麼0替換它們或一些默認號碼,或者如果條件保持一個返回false,如果放置爲NaN – rakesh

回答

0

不知道我理解您的問與答100%,但是,怎麼樣? (這裏當然你更換{3}與{13}

import re 

def parse(s, pattern=r"(\d{3})"): 
    if type(s) is str: 
     match = re.search(pattern, s) 
     if match: 
      return match.group(0) 
    return "False" 

>> df = pd.DataFrame({"a": ["123", "1 2", np.nan, None, 123]}) 

     a 
0 123 
1 1 2 
2 NaN 
3 None 
4 123 

>> df['a'].apply(parse) 

0  123 
1 False 
2 False 
3 False 
4 False 
Name: a, dtype: object 
+0

喜wotalf這真是太神奇了,這是一個更復雜功能的第一步,出於好奇,是否將模式放置在函數的變量設置中是正常的? –

+0

這取決於你將如何使用該解析器。速度,如果只使用該解析器僅用於13位數字長度的數字,那麼您實際上可以在該函數內定義該模式,但是,如果您想對相同的解析器使用例如10位長數字或5個字母長的字符串,那麼你可能想保留作爲一個論點,我把它作爲一個kw參數主要是f或清晰度。如果你願意,你可以每次都通過這個模式。 – dataflow