python - 删除列的功能
问题描述
我正在处理一个 Kaggle 挑战,其中训练集和测试集已经分开。在 EDA 之后,我从训练集中删除了一些列。为了节省一些时间,我尝试创建一个函数,如果训练集没有同名的列,则从测试集中删除列,但是我收到一条错误消息
“只有整数、切片 ( :
)、省略号 ( ...
)、numpy.newaxis ( None
) 和整数或布尔数组是有效索引”
这是我最初编写的代码:
def drop_columns(dataset1, dataset2):
"""
This function removes columns from
dataset2 that are not in dataset1
"""
columns_to_drop = pd.DataFrame()
for i in dataset1:
for n in dataset2:
if dataset1.columns[i] == dataset2.columns[n]:
columns_to_drop[dataset2.columns[n]] = dataset2[n]
new_dataset = dataset2.drop(columns_to_drop.columns, axis=1)
有人对我如何改进我的功能有提示吗?
解决方案
您正在尝试将要放入的列的标签放入DataFrame
. 我对 Pandas 不太熟悉,但就其本身而言,这似乎很奇怪;肯定一个更简单的数据结构,例如 alist
或 a set
,在这里就足够了吗?
在任何情况下,您都试图获得dataset2.columns[n]
,并且通过快速浏览文档,我无法找到可以实现的目标。但是由于这样做的目的是获取要删除的那些列的标签,因此您可以直接使用名称i
,n
因为迭代 aDataFrame
会给您列标签。
此外,实现的逻辑似乎不正确。您想删除那些在dataset1
和不在的列dataset2
,因此比较它们的标签就足够了,但是您正在比较 的值DataFrame.columns[...]
,并删除它们匹配的那些列。
同样,我不熟悉 Pandas,但我会将其替换为:
cols_1 = set()
for col_label in dataset1:
cols_1.add(col_label)
cols_2 = set()
for col_label in dataset2:
cols_2.add(col_label)
columns_to_drop = cols2.difference(cols_1)
new_dataset = dataset2.drop(list(columns_to_drop), axis=1)
@Andreas 在评论中提交了一个更简单的解决方案,感觉它可以工作:
return dataset2[dataset1.columns]
推荐阅读
- azure-devops - 将 Git 存储库从 Azure DevOps 导入 RedHat JBPM
- reactjs - 反应如何将图像连续放置
- sql - 使用 `TRY_CAST` 后未删除 NULL 值
- swift - 如何在spritekit中检测一个节点是否指向另一个节点
- vue.js - Nuxt 防止页面重新加载布局
- spring-boot - 如果为消息设置了 STOMP "expires" 标头,则消息立即过期,无需等待标头中设置的过期时间
- c# - 如何停止协程但让 alpha 颜色在停止前先完成褪色?
- sql-server - 如何管理分组行计数
- react-native - 将 ref 作为函数参数传递 React Native
- android - 我如何在房间数据库android中求和值