在Jupyter Notebook与IDLE中pandas的sep='\s+'无法生效问题及解决
解决办法
问题根源是Python字符串的转义机制,\s在普通字符串中属于无效转义序列,触发了SyntaxWarning。要让pandas正确识别空白分隔符,有两种正确写法:
- 使用原始字符串:
sep=r'\s+'(推荐,写法更简洁) - 转义反斜杠:
sep='\\s+'
原因解释
在Python普通字符串中,\是转义字符,比如\n代表换行、\t代表制表符,但\s并不是合法的转义序列,所以Python会抛出警告。而pandas的sep参数需要的是正则表达式中的\s+(匹配1个或多个空白字符),因此必须让Python将\s原封不动地传递给正则引擎——原始字符串(前缀r)会自动忽略转义规则,手动把反斜杠转义为\\也能达到同样效果。
修正后的完整代码
import pandas as pd from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.neighbors import KNeighborsRegressor url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] # 使用原始字符串写法处理分隔符 dataframe = pd.read_csv(url, sep=r'\s+', names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = KFold(n_splits=10, random_state=7, shuffle=True) model = KNeighborsRegressor() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean())
参考pandas文档说明
delim_whitespace : boolean, default False Specifies whether or not whitespace (e.g. ' ' or ' ') will be used as the sep. Equivalent to setting sep='\s+'. If this option is set to True, nothing should be passed in for the delimiter parameter.
文档里提到delim_whitespace=True等价于sep='\s+',但这里的\s+是正则表达式语法,在Python中必须处理转义才能正确使用。
内容的提问来源于stack exchange,提问作者No Time
相关产品推荐
相关产品推荐

