Python 从dataframe中删除只有一个值的列的最佳方法

Python 从dataframe中删除只有一个值的列的最佳方法,python,pandas,Python,Pandas,我试图构建一个函数,从数据集中消除只有一个值的列。我使用了这个函数: def oneCatElimination(dataframe): columns=dataframe.columns.values for column in columns: if len(dataframe[column].value_counts().unique())==1: del dataframe[column] return dataf

我试图构建一个函数,从数据集中消除只有一个值的列。我使用了这个函数:

def oneCatElimination(dataframe):
    columns=dataframe.columns.values
    for column in columns:
        if len(dataframe[column].value_counts().unique())==1:
             del dataframe[column]   
     return dataframe

问题是,该函数消除了具有多个不同值的偶数列,即具有整数的索引列。

对此进行了一些假设:

  • Null/NA值不计算在内
  • 您需要多个非NA值来保留一列
  • 这些值需要在某些方面有所不同(例如,一列中满是1,只应删除1)
总之,我会在列上使用
select
语句

如果从该数据帧开始:

import pandas

N = 15
df = pandas.DataFrame(index=range(10), columns=list('ABCD'))
df.loc[2, 'A'] = 23
df.loc[3, 'B'] = 52
df.loc[4, 'B'] = 36
df.loc[5, 'C'] = 11
df.loc[6, 'C'] = 11
df.loc[7, 'D'] = 43
df.loc[8, 'D'] = 63
df.loc[9, 'D'] = 97

df
这就产生了:

     A    B    C    D
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2   23  NaN  NaN  NaN
3  NaN   52  NaN  NaN
4  NaN   36  NaN  NaN
5  NaN  NaN   11  NaN
6  NaN  NaN   11  NaN
7  NaN  NaN  NaN   43
8  NaN  NaN  NaN   63
9  NaN  NaN  NaN   97
根据我上面的假设,A列和C列应该删除,因为A只有一个值,而C的两个值是相同的。然后,您可以执行以下操作:

df.select(lambda c: df[c].dropna().unique().shape[0] > 1, axis=1)
这给了我:

     B    D
0  NaN  NaN
1  NaN  NaN
2  NaN  NaN
3   52  NaN
4   36  NaN
5  NaN  NaN
6  NaN  NaN
7  NaN   43
8  NaN   63
9  NaN   97
只是


会有用的。不需要其他任何东西。它将保留具有2个或更多非NA值的所有列(由传递给
thresh
的值控制)。
axis
kwarg将允许您处理行或列。默认情况下,它是行,因此您需要显式地传递axis=1来处理列(我在回答时忘记了这一点,因此进行了此编辑)。有关更多信息,请参阅。

这将适用于文本和数字:

for col in dataframe:
    if(len(dataframe.loc[:,col].unique()) == 1):
        dataframe.pop(col)

注意:这将从原始数据帧中删除只有一个值的列。

请向我们展示一个函数无法按预期工作的情况。加1可找到包含电池的方法。
for col in dataframe:
    if(len(dataframe.loc[:,col].unique()) == 1):
        dataframe.pop(col)