当前位置: 首页 > 面试题库 >

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

柳培
2023-03-14
问题内容

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

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

对于大型数据帧,这确实非常慢。从逻辑上讲,这实际上是在达到2个不同的值后才停止计数的情况下,对每列中的值数量进行计数。


问题答案:

您可以使用Series.unique()method找出一列中所有唯一的元素,对于.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和遍历各列的方法。



 类似资料:
  • 我有一个数据帧重复行除了一个值。我想过滤掉它们,只保留值较高的行。 等等。 因此,例如,需要比较具有skill_a和相同User_ID的行,并且只保留具有最近一年的行。 仅按用户ID提供组的行数。 只给了我一个系列,我无法合并回df。 反对的想法? 谢谢你

  • 问题内容: 我有两个数据框,第一个有1000行,看起来像: 该列具有不同的值,有时会重复,但通常大约有50个唯一值。 第二个数据框包含所有这50个唯一值(50行)以及与这些值关联的酒店: 我的目标是用第二个数据帧的列的相应值替换第一个数据帧的列中的值,或者用相应的值创建该列。当我尝试通过像 我有一个错误,即数据帧的大小不相等,因此无法进行比较 问题答案: 如果将索引设置为另一个df上的“组”列,则

  • 问题内容: 我最近在大型数据框及其关联的多索引中遇到了此问题。这个简化的示例将演示该问题。 产生: 现在快速浏览一下索引 如果我对该数据帧进行切片,我会注意到多重索引永远不会凝聚。即使是深复制。 减少分片操作中索引的内存占用的最佳方法是什么? 查看数据帧如何减少,但索引没有减少。 即使使用.copy(deep = True) 我希望MultiIndex除去6,如下所示: 当数据帧很大时,实际上就会

  • 问题内容: 我有两个数组 我想从array1中删除array2的元素 问题答案: 最简单的方法是将两个数组都转换为集合,从第一个数组中减去第二个数组,将结果转换为数组,然后将其分配回: 请注意,您的代码不是有效的Swift-您可以使用类型推断来声明和初始化两个数组,如下所示:

  • 本文向大家介绍高效快速地删除 mysql 重复数据,包括了高效快速地删除 mysql 重复数据的使用技巧和注意事项,需要的朋友参考一下 MYSQL数据库中单表有几百万数据,使用几种delete方法删除重复的数据耗时比较长,运行语句,半天出不来,甚至出现服务器内部错误。 mysql 给表添加唯一索引 完成重复记录删除 不希望数据表中有重复记录的时候我们可以给表添加一个联合唯一索引 例如,user表中

  • 我有一个数据帧(df1),其中包含200多列数据(每列数千行)。列名是字母数字的,并且彼此不同。 我有第二个数据集(df2),其中包含几列,其中第一列(名为“col1”)包含带有“值”的行,这些行带有df1的列名。 但不是对于df2中的每一行,我在df1中具有对应的列。 现在,我想删除(删除)df2中没有“对应”列的所有行。 我用“子集data.frame另一个data.frame的值”这样的关键