我需要删除列:
- 任何唯一值的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))