根据行中值的频率过滤数据帧

时间:2020-01-08 23:51:04

标签: python pandas dataframe

我已经审查了许多与我类似的问题,但是我还没有找到想要的明确解决方案(如果您将答案链接到重复的问题或类似问题,我很高兴已经被回答)。

我有一个如下数据框:

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的值的频率(不基于列名),我认为后者并不是那么有挑战性。

3 个答案:

答案 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)