快速删除只有一个不同值的数据框列

新手上路,请多包涵

有没有比下面的代码更快的方法来删除只包含一个不同值的列?

 cols=df.columns.tolist()
for col in cols:
    if len(set(df[col].tolist()))<2:
        df=df.drop(col, axis=1)

这对于大型数据帧来说真的很慢。从逻辑上讲,这会计算每列中值的数量,而实际上它可能会在达到 2 个不同的值后停止计数。

原文由 Alexis Eggermont 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 376
2 个回答

您可以使用 Series.unique() 方法找出列中的所有唯一元素,对于其 .unique() 仅返回 1 的列,您可以删除该元素,您可以删除该元素。例子 -

 for col in df.columns:
    if len(df[col].unique()) == 1:
        df.drop(col,inplace=True,axis=1)

一种不进行就地丢弃的方法 -

 res = df
for col in df.columns:
    if len(df[col].unique()) == 1:
        res = res.drop(col,axis=1)


演示 -

 In [154]: df = pd.DataFrame([[1,2,3],[1,3,3],[1,2,3]])

In [155]: for col in df.columns:
   .....:     if len(df[col].unique()) == 1:
   .....:         df.drop(col,inplace=True,axis=1)
   .....:

In [156]: df
Out[156]:
   1
0  2
1  3
2  2


计时结果 -

 In [166]: %paste
def func1(df):
        res = df
        for col in df.columns:
                if len(df[col].unique()) == 1:
                        res = res.drop(col,axis=1)
        return res

## -- End pasted text --

In [172]: df = pd.DataFrame({'a':1, 'b':np.arange(5), 'c':[0,0,2,2,2]})

In [178]: %timeit func1(df)
1000 loops, best of 3: 1.05 ms per loop

In [180]: %timeit df[df.apply(pd.Series.value_counts).dropna(thresh=2, axis=1).columns]
100 loops, best of 3: 8.81 ms per loop

In [181]: %timeit df.apply(pd.Series.value_counts).dropna(thresh=2, axis=1)
100 loops, best of 3: 5.81 ms per loop

最快的方法似乎仍然是使用 unique 并循环遍历列的方法。

原文由 Anand S Kumar 发布,翻译遵循 CC BY-SA 3.0 许可协议

一步:

 df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]]

两个步骤:

创建具有超过 1 个不同值的列名列表。

 keep = [c for c
        in list(df)
        if len(df[c].unique()) > 1]

删除不在“保留”中的列

df = df[keep]

注意:此步骤也可以使用要删除的列列表来完成:

 drop_cols = [c for c
             in list(df)
             if df[c].nunique() <= 1]
df = df.drop(columns=drop_cols)

原文由 kait 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题