Panda 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

Есть ли простой способ определить, существует ли какой-либо из этих столбцов, а затем удалить их?

Ответ 1

Я считаю, что этот вариант будет быстрее, чем другие ответы здесь, поскольку он будет перемещаться по кадру данных только один раз для сравнения и короткого замыкания, если обнаружено не уникальное значение.

>>> 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

Ответ 2

Игнорируя 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

Ответ 3

Предполагая, что DataFrame полностью имеет тип numeric:

вы можете попробовать:

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

который удалит столбцы констант (например, variance = 0).

Если DataFrame имеет тип как числовой, так и объект, вы должны попробовать:

>>> 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)