仅保留所有值value_count大于某个阈值的熊猫列;



我需要删除列:

  • 任何唯一值的value_counts都低于某个阈值

(s.value_counts() > THRESHOLD).all()

  • OR 唯一值的数量大于其他阈值

nunique() > OTHER_THRESH

我尝试使用 Pandas:从出现超过 X 次的列中获取值以获取所有列的值计数,但我被困在索引上。

>>> test
      col1  col2    a    b     c
col1                            
1      0.0     3  5.0  6.0   7.0
2      0.0     4  8.0  9.0  10.0
>>> test.apply(lambda s: (s.value_counts() > 1).all() if s.nunique() < 3 else s.nunique() > 1)
col1     True
col2    False
a       False
b       False
c       False
>>> test[test.apply(lambda s: (s.value_counts() > 1).all() if s.nunique() < 3 else s.nunique() > 1).index]
      col1  col2    a    b     c
col1                            
1      0.0     3  5.0  6.0   7.0
2      0.0     4  8.0  9.0  10.0

我只想在示例中col1,但又得到了一切。我可以迭代列名:

>>> asdf = test.apply(lambda s: (s.value_counts() > 1).all() if s.nunique() < 3 else s.nunique() > 1)
>>> test[asdf[asdf == True].index]
      col1
col1      
1      0.0
2      0.0

但我不确定这是"正确"/标准的方法(标准意味着高效和清晰(。将asdf分配给整个 apply 函数,然后提取其索引似乎过于笨拙/复杂。如何在这里更有效地使用熊猫来确保高效的计算?

你只需要使用.loc

m = test.apply(lambda s: (s.value_counts() > 1).all() if s.nunique() < 3 else s.nunique() > 1)
test.loc[:, m]
Out[742]:
      col1
col1
1        0.0
2        0.0

下面的代码片段过滤了数据框中的那些列,其中 不。的唯一值等于小于给定的阈值限制,例如 20 个唯一值。

counter = []
for col in df.columns:
    if df[col].nunique() <= 20:
        counter.append(col)
print(list(counter))

最新更新