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)