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

xkc*_*kcd 0 python dataframe pandas

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

ayh*_*han 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
Run Code Online (Sandbox Code Playgroud)

时序:

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

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
Run Code Online (Sandbox Code Playgroud)


MMF*_*MMF 5

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

df = df[[col for col in df if not len(set(df[col]))==1]]
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,`df [col] .nunique()== 1`比`len(set(df [col]))== 1`快. (2认同)