2016-06-27 49 views
0

我有一個包含字符串列的數據集。其中一列包含一個標識符。現在我想檢查該標識符是否遵循這種模式:例如AB12CD,所以2個字母(首都),2個數字後跟2個字母。試圖檢查Python中的字符串是否遵循正確的模式(良好的格式)

數據存儲在熊貓數據框中。我有:

for i in range(0, len(data.columns)): 
    if data.columns[i] == 'identifier ': 
     pattern = re.compile("[A-Z][A-Z][0-9][0-9][A-Z][A-Z]") 
     if pattern.match(data.ix[i, 0]): 
      data['identifier Check'] = 'Ok' 
     else: 
      data['identifier Check'] = 'identifier Format incorrect' 

但這不起作用。它放在每行OK或Corp Key不正確。取決於第一行。

任何人都可以幫助我嗎? 謝謝!

回答

2

您的代碼無法按預期方式工作,因爲data['identifier Check'] = 'Ok'將分配給identifier Check列中的每一行。

您的代碼還會逐列掃描DataFrame而不是逐行掃描(即檢查每列的第一行中的值,而不是檢查每行的特定列中的值)。

我的解決方案定義了一個函數,返回給定字符串和模式的所需輸出。

使用pandas.Series所具有的apply方法調用此函數。在這種情況下,它將遍歷data['identifier']列中的每個項目並將其發送到check_identifier函數。 data['identifier'].apply(check_identifier)的結果將爲np.array,然後將其分配給DataFrame中新創建的identifier Check列。

# abusing the fact that default arguments are evaluated only during function definition 
def check_identifier(value, pattern=re.compile("[A-Z][A-Z][0-9][0-9][A-Z][A-Z]")): 
    return 'OK' if pattern.match(value) else 'identifier Format incorrect' 

data['identifier Check'] = data['identifier'].apply(check_identifier) 

一個例子:

def check_identifier(value, pattern=re.compile("[A-Z][A-Z][0-9][0-9][A-Z][A-Z]")): 
    return 'OK' if pattern.match(value) else 'identifier Format incorrect' 

df = pd.DataFrame({'a':['AB12CD', 'AB12Cd']}) 
print(df) 
>>   a    
    0 AB12CD 
    1 AB12Cd 

df['identifier Check'] = df['a'].apply(check_identifier) 

print(df) 
>>   a    identifier Check 
    0 AB12CD       OK 
    1 AB12Cd identifier Format incorrect