我有一个包含带字符串的列的数据集。其中一列包含标识符。现在我想检查该标识符是否遵循这种模式:例如AB12CD,所以2个字母(大写),2个数字后跟2个字母。
数据存储在pandas数据框中。我有:
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不正确。取决于第一行。
任何人都可以帮助我吗? 谢谢!
答案 0 :(得分:2)
您的代码没有按预期工作,因为data['identifier Check'] = 'Ok'
会将'Ok'
分配给identifier Check
列中的每一行。
您的代码也会按列而不是逐行扫描DataFrame(即它会检查每列的第一行中的值,而不是检查每行的特定列中的值)。
我的解决方案定义了一个函数,该函数在给定字符串和模式的情况下返回所需的输出。
使用apply
具有的pandas.Series
方法调用此函数。在这种情况下,它将覆盖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