Python 如何在包含相同值的数据帧中删除列

Python 如何在包含相同值的数据帧中删除列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个Pandas数据框架,其中的一些列在每一行中都具有相同的值 比如:- Col1 Col2 Col3 .... ColX ColY ColZ 323 False 324 4 abc Sync 232 False 342 4 def Sync 364 False 2343 4 ghi Sync 因此,我想从上面的数据框中删除Col2、C

我有一个Pandas数据框架,其中的一些列在每一行中都具有相同的值

比如:-

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

因此,我想从上面的数据框中删除Col2、ColX和ColZ。

您可以将数据框与特定行进行比较(我使用
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

时间:

nunique
,比将序列与单个值进行比较要快得多。除非有大量列(例如,数千列)在列上迭代,否则这看起来是一种更有效的方法

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

您可以将数据帧与特定行进行比较(我使用
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

时间:

nunique
,比将序列与单个值进行比较要快得多。除非有大量列(例如,数千列)在列上迭代,否则这看起来是一种更有效的方法

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

您还可以通过检查由每列的值生成的集合的长度来执行此操作:

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

您还可以通过检查由每列的值生成的集合的长度来执行此操作:

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

工作起来很有魅力!已解决。能否为更大的DF添加时间比较?我胡乱猜测-您的解决方案会更快…@MaxU:根据我的计时,另一个解决方案更快。@MaxU我添加了计时。@root您尝试的解决方案的列数是多少?我想当有很多列时,迭代列会减慢其他解决方案的速度。我实际上增加了列的数量,这样我就可以有一个大的df,其中列的值相同,但它当然可能不具有代表性。工作起来很有魅力!已解决。能否为更大的DF添加时间比较?我胡乱猜测-您的解决方案会更快…@MaxU:根据我的计时,另一个解决方案更快。@MaxU我添加了计时。@root您尝试的解决方案的列数是多少?我想当有很多列时,迭代列会减慢其他解决方案的速度。实际上,我增加了列的数量,这样我就可以有一个大的df,其中列的值相同,但它当然不具有代表性。仅供参考,
df[col]。nunique()==1
len(set(df[col])==1
快。如果一些列的值始终相同,并且是一个大数据帧,而仅仅比较前两个或三个连续列的值就足以消除整个列。为什么我们需要检查整个列?@root谢谢;)仅供参考,
df[col].nunique()==1
len(set(df[col])==1
快。如果某些列的值在整个过程中相同,并且是一个大数据帧,那么可能仅比较前两个或三个连续列的值就足以消除整个列。为什么我们需要检查整个列?@root谢谢;)