2016-06-27 2 views
0

文字列のある列を含むデータセットがあります。これらの列の1つに識別子が含まれています。次に、その識別子がこのパターンに従っているかどうかを確認したいと思います。 AB12CDなので、2文字(首都)、2つの数字の後ろに2文字をもう一度入力します。PythonのStringが正しいパターン(適切な書式設定)に従っているかどうかを確認しようとしています

データは、パンダのデータフレームに格納されます。私は持っています:

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キーが間違っています。最初の行に応じて。

誰も私を助けることができますか? ありがとう!

答えて

2

data['identifier Check'] = 'Ok'identifier Check列のすべての行に'Ok'を割り当てているため、コードが期待通りに機能しません。

あなたのコードでは、行ごとではなく列方向にスキャンします(つまり、各行の特定の列の値をチェックするのではなく、各列の最初の行の値をチェックします)。

私のソリューションは、文字列とパターンを指定して、必要な出力を返す関数を定義しています。

この関数は、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 
関連する問題