我有一个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。
答案 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 suggestion,nunique
比将系列与单个值进行比较要快得多。除非你有大量的列(例如数千个)迭代列,因为@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]]