我已经审查了许多与我类似的问题,但是我还没有找到想要的明确解决方案(如果您将答案链接到重复的问题或类似问题,我很高兴已经被回答)。
我有一个如下数据框:
col_0 | col_1 | col_2 | col_3 | col_4 | col_5
---------------------------------------------
0.2 1 1 1 1 1
0.3 0.4 1 1 1 1
0.1 1 0.3 1 1 1
我只是想过滤/排除1
的频率大于阈值(通常是基于条件的频率/计数)的那些行,在这里说4
。结果,我希望在输出中提供如下数据框:
col_0 | col_1 | col_2 | col_3 | col_4 | col_5
---------------------------------------------
0.3 0.4 1 1 1 1
0.1 1 0.3 1 1 1
所以我的关键问题是:如何根据频率/特定值的计数排除数据框中的行。而且,理想情况下,我想指定一行中的列范围,例如,列索引0到4的值的频率(不基于列名),我认为后者并不是那么有挑战性。
答案 0 :(得分:1)
这行吗?
df.loc[(df==1).sum(axis=1).between(0,4),:]
答案 1 :(得分:0)
您可以使用:
df[df.eq(1).sum(axis=1).le(4)]
col_0 col_1 col_2 col_3 col_4 col_5
1 0.3 0.4 1.0 1 1 1
2 0.1 1.0 0.3 1 1 1
答案 2 :(得分:0)
也许不是最快的方法,但也许很容易看到发生了什么事
import pandas as pd
d = {'col_0' : [ 0.2, 0.3, 0.1],
'col_1' : [ 1, 0.4, 1],
'col_2' : [ 1, 1, 0.3],
'col_3' : [ 1, 1, 1],
'col_4' : [ 1, 1, 1],
'col_5' : [ 1, 1, 1]}
df = pd.DataFrame(d)
def apply_freq_filter(df, value, frequency, col_start, col_end):
f = df.iloc[:,col_start:col_end+1].apply(pd.value_counts, axis=1)
f = f[value] <= frequency
return df[f]
df = apply_freq_filter(df, 1, 4, 0, 5)
print(df)