报错TypeError:不支持集合作为索引器,请求解决及原因排查
解决从GCP Bucket读取Pickle文件后划分训练测试集的TypeError问题
解决方案
直接将列选择时的集合(set)转换为列表(list),或者用列表推导式筛选列,避免使用集合作为pandas的列索引器。
方式1:集合转列表(会打乱列顺序)
修改train_test_split的第一个参数:
X_train, X_test, y_train, y_test = train_test_split( df[list(set(df.columns) - set(['load_date','target']))], df['target'], test_size=0.2, shuffle=True, random_state=21, stratify=df[['load_date','target']] )
方式2:列表推导式(保留原始列顺序,推荐)
这种方式更稳妥,还能保持列的原有排列:
X_train, X_test, y_train, y_test = train_test_split( df[[col for col in df.columns if col not in ['load_date','target']]], df['target'], test_size=0.2, shuffle=True, random_state=21, stratify=df[['load_date','target']] )
原因排查
- 直接报错原因:pandas从1.5.0版本开始,严格禁止使用集合(set)作为DataFrame的列索引器,要求必须使用列表(list)、元组(tuple)等有序序列,否则触发
TypeError。 - 本地可运行的原因:你本地环境的pandas版本较低,尚未启用该严格检查,允许使用集合作为索引器;而GCP环境的pandas版本更高,执行了该规则,因此出现报错。
- 和读取方式无关:报错和从本地/GCP Bucket读取文件的方式没有关系,本质是不同环境的pandas版本差异导致的兼容性问题。
内容的提问来源于stack exchange,提问作者Claudia Jorqueira
相关产品推荐
相关产品推荐

