使用pd.drop()触发TypeError:str与int间不支持'>'运算
先明确你的需求:从copy_data中移除所有不在farmConfig['mapping']对应的column字段(去掉.后缀后的部分)中的列。你的列名集合计算逻辑看起来是对的,但还是报错,我帮你梳理几个最可能的原因和解决办法:
1. 最常见的错误:未指定axis=1参数
如果你执行移除列的代码是:
copy_data.drop(set_to_remove)
那一定会报错!因为pandas.DataFrame.drop()默认参数是axis=0(按行删除),它会去行索引中找这些列名,自然找不到。正确的写法应该指定按列删除:
copy_data.drop(set_to_remove, axis=1, inplace=True) # 或者不修改原DataFrame,返回新对象 new_data = copy_data.drop(set_to_remove, axis=1)
如果你的报错是KeyError: "['xxx'] not found in axis",那大概率是这个原因。
2. 列名类型不匹配(比如MultiIndex列)
如果copy_data的列是多级索引(MultiIndex),那么list(copy_data)得到的是元组(比如('a', 'detail')),而你从farmConfig中生成的是字符串(比如'a')。这时候两个集合的元素类型不同,无法匹配,导致set_to_remove等于copy_data的所有列集合,执行drop时就会出现异常(或者意外删除所有列)。
解决办法:先把MultiIndex列转换为单级索引,或者调整列名匹配逻辑。比如如果你的多级索引第一级是需要匹配的部分,可以这样生成保留列集合:
# 假设MultiIndex的第一级是要匹配的部分 keep_columns = set([self.farmConfig['mapping'][column]['column'].split('.')[0] for column in self.farmConfig['mapping']]) set_to_remove = [col for col in copy_data.columns if col[0] not in keep_columns]
然后用这个列表去drop:
copy_data.drop(set_to_remove, axis=1, inplace=True)
3. 隐藏的列名不一致问题
虽然你确认内容正确,但还是要检查几个细节:
- 列名的大小写:比如
copy_data的列是'A',但farmConfig中是'a',集合相减时会被判定为不同元素,导致误删。可以统一转换为小写/大写再比较:copy_cols = set(col.lower() for col in copy_data.columns) keep_cols = set([self.farmConfig['mapping'][column]['column'].split('.')[0].lower() for column in self.farmConfig['mapping']]) set_to_remove = [col for col in copy_data.columns if col.lower() not in keep_cols] - 列名中的空格或特殊字符:比如
'a '(带空格)和'a'会被视为不同元素,建议先清理列名:copy_data.columns = [col.strip() for col in copy_data.columns]
4. 执行drop时未处理不存在的列(保险起见)
如果因为某些意外情况,set_to_remove中包含了copy_data没有的列,可以添加errors='ignore'参数跳过不存在的列:
copy_data.drop(set_to_remove, axis=1, inplace=True, errors='ignore')
你可以先检查第一种情况(是否漏写axis=1),这是最容易犯的错误。如果还是不行,可以把报错信息贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者Antimony

