首页 > 解决方案 > 删除列的功能

问题描述

我正在处理一个 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)

有人对我如何改进我的功能有提示吗?

标签: pythonfunction

解决方案


您正在尝试将要放入的列的标签放入DataFrame. 我对 Pandas 不太熟悉,但就其本身而言,这似乎很奇怪;肯定一个更简单的数据结构,例如 alist或 a set,在这里就足够了吗?

在任何情况下,您都试图获得dataset2.columns[n],并且通过快速浏览文档,我无法找到可以实现的目标。但是由于这样做的目的是获取要删除的那些列的标签,因此您可以直接使用名称in因为迭代 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]

推荐阅读