如何删除包含相同值的Pandas DataFrame中的列

时间:2016-11-08 17:44:00

标签: python pandas dataframe

我有一个Pandas DataFrame,其中一些列在每一行中具有相同的值。

类似于: -

Col1    Col2     Col3 ....  ColX  ColY    ColZ
323     False    324          4    abc    Sync 
232     False    342          4    def    Sync
364     False    2343         4    ghi    Sync

所以我想从上面的DataFrame中删除Col2,ColX和ColZ。

2 个答案:

答案 0 :(得分:6)

您可以将DataFrame与特定行进行比较(我选择第一行df.iloc[0])并使用loc选择满足您指定条件的列:

df.loc[:, ~(df == df.iloc[0]).all()]
Out: 
   Col1  Col3 ColY
0   323   324  abc
1   232   342  def
2   364  2343  ghi

时序:

@root's suggestionnunique比将系列与单个值进行比较要快得多。除非你有大量的列(例如数千个)迭代列,因为@MMF suggested看起来更像是一种更有效的方法。

df = pd.concat([df]*10**5, ignore_index=True)

%timeit df.loc[:, ~(df == df.iloc[0]).all()]
1 loop, best of 3: 377 ms per loop

%timeit df[[col for col in df if not df[col].nunique()==1]]
10 loops, best of 3: 35.6 ms per loop


df = pd.concat([df]*10, axis=1, ignore_index=True)

%timeit df.loc[:, ~(df == df.iloc[0]).all()]
1 loop, best of 3: 3.71 s per loop

%timeit df[[col for col in df if not df[col].nunique()==1]]
1 loop, best of 3: 353 ms per loop


df = pd.concat([df]*3, axis=1, ignore_index=True)

%timeit df.loc[:, ~(df == df.iloc[0]).all()]
1 loop, best of 3: 11.3 s per loop

%timeit df[[col for col in df if not df[col].nunique()==1]]
1 loop, best of 3: 1.06 s per loop

答案 1 :(得分:5)

您还可以检查每列值生成的集合的长度:

df = df[[col for col in df if not len(set(df[col]))==1]]