Python报错:str与int不支持&运算符,pandas代码排查求助
问题分析与解决
报错原因
你遇到的unsupported operand type(s) for &: 'str' and 'int'错误,根源是错误地使用*解包列表作为str.contains()的参数。
pandas.Series.str.contains()的第一个参数是正则表达式字符串(pat),后续参数是关键字参数(如case、flags等,其中flags要求传入整数类型的正则标志,比如re.IGNORECASE)。当你用*connection_issue解包4个元素的列表时:
- 第一个元素
'load'被当作pat - 第二个元素
'loading'被传给case参数(非空字符串会被转为布尔值True,暂时没问题) - 第三个元素
'error loading'被传给flags参数,而flags需要整数,内部处理时尝试对字符串和整数做位运算&,直接触发类型错误
至于tablet的*tablet没报错,只是巧合:列表只有2个元素,第二个元素被传给case参数(转为True),没触及flags参数,但逻辑是错误的——它只会检查是否包含'ipad',而非'ipad'或'tablet'中的任意一个。
解决方案
要匹配列表中的任意关键词,正确的做法是用'|'.join()将列表转为正则表达式字符串(|表示正则中的“或”逻辑),传入str.contains()的pat参数。修正后的代码如下:
import numpy as np import pandas as pd tablet = ['ipad', 'tablet'] connection_issue = ['load', 'loading','error loading', 'connection issue'] blankQuestion = ['blank question', 'question loading', 'question does not load', 'question doesn\'t load','no question'] mocktest = ['mock test','mock tests'] # 将每个关键词列表转为正则或表达式 tablet_pat = '|'.join(tablet) connection_pat = '|'.join(connection_issue) mocktest_pat = '|'.join(mocktest) df['bug_types'] = np.where(df['Ticket description'].str.contains(tablet_pat), 'tablet', np.where(df['Ticket description'].str.contains(connection_pat), 'connectionz', np.where(df['Ticket description'].isin(blankQuestion), 'blankQuestion', np.where(df['Ticket description'].str.contains(mocktest_pat), 'mock tests', 'others'))))
额外说明
- 如果关键词中包含正则特殊字符(比如
.、*),需要先用re.escape()转义,避免正则匹配异常:import re connection_pat = '|'.join(map(re.escape, connection_issue)) isin()是检查整个字符串是否完全匹配列表中的元素,而str.contains()是检查字符串是否包含子串,两者逻辑不同,根据你的需求选择即可。
内容的提问来源于stack exchange,提问作者NNN
相关产品推荐
相关产品推荐

