pandas dataframe删除常量列

时间:2013-11-26 05:59:18

标签: python pandas dataframe

我有一个数据框,可能有也可能没有相同值的列。例如

    row    A    B
    1      9    0
    2      7    0
    3      5    0
    4      2    0

我想回归

   row    A  
   1      9    
   2      7    
   3      5    
   4      2

是否有一种简单的方法可以识别是否存在这些列,然后将其删除?

6 个答案:

答案 0 :(得分:32)

我相信这个选项会比这里的其他答案更快,因为如果找到非唯一值,它只会遍历数据帧一次以进行比较和短路。

>>> df

   0  1  2
0  1  9  0
1  2  7  0
2  3  7  0

>>> df.loc[:, (df != df.iloc[0]).any()] 

   0  1
0  1  9
1  2  7
2  3  7

答案 1 :(得分:19)

像往常一样忽略NaN,如果nunique() == 1,则列是常量。所以:

>>> df
   A  B  row
0  9  0    1
1  7  0    2
2  5  0    3
3  2  0    4
>>> df = df.loc[:,df.apply(pd.Series.nunique) != 1]
>>> df
   A  row
0  9    1
1  7    2
2  5    3
3  2    4

答案 2 :(得分:2)

假设DataFrame完全是数字类型:

你可以尝试:

>>> df = df.loc[:, df.var() == 0.0]

将删除常量(即方差= 0)列。

如果DataFrame的类型是numeric和object,那么你应该尝试:

>>> enum_df = df.select_dtypes(include=['object'])
>>> num_df = df.select_dtypes(exclude=['object'])
>>> num_df = num_df.loc[:, num_df.var() == 0.0]
>>> df = pd.concat([num_df, enum_df], axis=1)

将仅删除数值类型的常量列。

如果你还想忽略/删除常量枚举列,你应该尝试:

>>> enum_df = df.select_dtypes(include=['object'])
>>> num_df = df.select_dtypes(exclude=['object'])
>>> enum_df = enum_df.loc[:, [True if y !=1 else False for y in [len(np.unique(x, return_counts=True)[-1]) for x in enum_df.T.as_matrix()]]]
>>> num_df = num_df.loc[:, num_df.var() == 0.0]
>>> df = pd.concat([num_df, enum_df], axis=1)

答案 3 :(得分:2)

我在大小为120 * 10000的数据帧上比较了各种方法。并找到了有效的一个

def drop_constant_column(dataframe):
    """
    Drops constant value columns of pandas dataframe.
    """
    return dataframe.loc[:, (dataframe != dataframe.iloc[0]).any()]
  

1个循环,最佳3:每循环237 ms

其他竞争者

def drop_constant_columns(dataframe):
    """
    Drops constant value columns of pandas dataframe.
    """
    result = dataframe.copy()
    for column in dataframe.columns:
        if len(dataframe[column].unique()) == 1:
            result = result.drop(column,axis=1)
    return result
  

1个循环,最佳3:每循环19.2秒

def drop_constant_columns_2(dataframe):
    """
    Drops constant value columns of pandas dataframe.
    """
    for column in dataframe.columns:
        if len(dataframe[column].unique()) == 1:
            dataframe.drop(column,inplace=True,axis=1)
    return dataframe
  

1个循环,最佳3:317 ms每个循环

def drop_constant_columns_3(dataframe):
    """
    Drops constant value columns of pandas dataframe.
    """
    keep_columns = [col for col in dataframe.columns if len(dataframe[col].unique()) > 1]
    return dataframe[keep_columns].copy()
  

1个循环,最佳3:每循环358 ms

def drop_constant_columns_4(dataframe):
    """
    Drops constant value columns of pandas dataframe.
    """
    keep_columns = dataframe.columns[dataframe.nunique()>1]
    return dataframe.loc[:,keep_columns].copy()
  

1个循环,最佳3:每循环1.8秒

答案 4 :(得分:0)

这是我的解决方案,因为我需要同时执行对象和数字列。没有声称它的超级效率或任何东西,但它完成工作。

def drop_constants(df):
    """iterate through columns and remove columns with constant values (all same)"""
    columns = df.columns.values
    for col in columns:
        # drop col if unique values is 1
        if df[col].nunique(dropna=False) == 1:
            del df[col]
    return df

另外需要注意的是,它不会在列表或数组列上工作,因为它们不可清除。

答案 5 :(得分:0)

此线程中的许多示例均无法正常工作。检查this my answer并收集有效的示例