我有一个数据框,可能有也可能没有相同值的列。例如
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
是否有一种简单的方法可以识别是否存在这些列,然后将其删除?
答案 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并收集有效的示例