【问题标题】:Generic way to drop columns that are not needed for learning (in python using pandas df)删除学习不需要的列的通用方法(在使用 pandas df 的 python 中)
【发布时间】:2022-12-04 10:29:12
【问题描述】:

通过通用;我的意思是说我不知道​​在拉入文件之前需要删除的列的名称。我找到的例子;假设您知道要删除的列的名称。熟悉 PlayTennis 数据集的人可能已经习惯看到:

my_df = pd.DataFrame({"Outlook": [Sunny,Cloudy,Rainy], "Temp":[Hot,Cold],
"Humidity":[high,low]...})

然而,在我的课堂上,我们得到第一列“天数”,例如:

my_df = pd.DataFrame({"Days":[D1,D2,...,D14],"Outlook": [Sunny,Cloudy,Rainy], "Temp":[Hot,Cold],"Humidity":[high,low]...})

显然,看着这个我想删除“天数”列:

df.drop(columns=['Days'], inplace=True)

问题是 playtennis 只是一个示例数据集,在实际数据集中,出于与“天数”相同的原因,我可能需要删除的列不会被称为天数。我需要一种方法来通过某种方法删除无用的列,该方法可以看到列中唯一值的数量并理解它太多而无用(编辑:意味着它过度拟合,如果我有 30 个实例和 30 天,模型将尝试根据今天是哪一天来预测结果,因此对可预测性没有用);在我将其读入我的机器学习算法之前。

import pandas as pd
import numpy as np

df_train = pd.read_csv("assets\playtennis.csv") # read in data
df_train.head() # see first 5

# get a list of attribute excluding the class label (e.g.,PlayTennis)
def attributes (df,label):
    return df.columns.drop(label).values.tolist()
    
    
def trash(df,attr,label):
    # Do something to trash useless columns
    df.drop(columns=[x],inplace=True)
    
class_label = df_train.columns[-1] # class label in the last column
attr = attributes(df_train,class_label)
trash(df_train,attr,class_label)

我只有大约 6 周的时间使用 python,所以请原谅(并指出)语法错误。

【问题讨论】:

  • 有什么问题?识别列名称,或将该名称作为变量传递给 drop?

标签: python pandas numpy


【解决方案1】:

首先,为什么要在数据集中删除 Days 列并不是很明显。 我假设您想要删除每行具有不同值的特征或太多唯一条目,以便该特征对您的测试标签没有可预测性。 您可以通过调用df['name'].unique() 获取列(例如“名称”)的唯一值,然后调用len() 获取唯一值的数量。

我建议您在删除该列之前为唯一值的最高比例设定一个阈值。

def trash(df, attr, label, threshold=0.8):
    for col in att:
        proportion = len(df.col.unique())/len(df)
        if proportion >= threshold:
            df.drop([col], inplace=True)

【讨论】:

  • 谢谢,您的假设是正确的。这确实是我需要删除专栏的原因。
【解决方案2】:

当您加载数据时,例如使用pd.read_csv,您只能使用参数usecols=[list-of-columns-i-care-about]加载您想要的列。这样你就不需要放弃它们。

【讨论】:

  • 感谢您的答复。虽然这很有用,但它不是我所需要的,因为它不是通用的。例如,我需要事先知道要删除哪些列,这意味着我需要读取每个文件以制作“我关心的列列表”
【解决方案3】:

您必须进一步定义understands its too many to be useful 的含义。

作为起点,您可以使用 nunique 计算每列唯一值的数量。

您可以使用该值来删除列。 例如,这会删除具有三个以上唯一值的所有列。

df.drop(columns=df.columns[df.nunique() > 3])

完整示例:

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'col2': ['a', 'b', 'c', 'c', 'd', 'd', 'e', 'f', 'f', 'g'],
    'col3': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b'],
    'col4': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3],
})


df.nunique()
col1    10
col2     7
col3     2
col4     3


df.drop(columns=df.columns[df.nunique() > 3], inplace=True)
  col3  col4
0    a     1
1    a     1
2    a     1
3    a     1
4    a     2
5    b     2
6    b     2
7    b     3
8    b     3
9    b     3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2022-01-15
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2020-12-14
    相关资源
    最近更新 更多