给定如下数据帧,我需要检查room
列:
id room
0 1 A-102
1 2 201
2 3 B309
3 4 C·102
4 5 E_1089
该列的正确格式应为numbers
、alphabet
或hyphen
,否则,用incorrect
填充check
列
预期结果如下:
id room check
0 1 A-102 NaN
1 2 201 NaN
2 3 B309 NaN
3 4 C·102 incorrect
4 5 E_1089 incorrect
这里的非正式语法可以是:
df.loc[<filter1> | (<filter2>) | (<filter3>), 'check'] = 'incorrect'
感谢您提前提供的帮助。
使用str.match
强制所有字符:
df['check'] = np.where(df.room.str.match('^[a-zA-Zd-]*$'), np.NaN, 'incorrect')
或具有否定模式的str.contains
:
df['check'] = np.where(df.room.str.contains('([^a-zA-Zd-])'), 'incorrect', np.NaN)
输出:
id room check
0 1 A-102 nan
1 2 201 nan
2 3 B309 nan
3 4 C·102 incorrect
4 5 E_1089 incorrect
如果要更新现有的check
列,请使用loc
访问权限。例如:
df.loc[df.room.str.contains('([^a-zA-Zd-])'), 'check'] = 'incorrect'
# or safer when `NaN` presents
# df.loc[df.room.str.contains('([^a-zA-Zd-])') == True, 'check'] = 'incorrect'