如何用二进制类过滤掉在python中特定频率以下的列?

时间:2019-05-10 10:03:30

标签: python pandas count scikit-learn multiple-columns

我对编程还很陌生,并且我肯定有很多解决方案,但是就目前而言,我的似乎行不通。我有一个包含200多个预测变量的数据集,其中大多数是二进制1 =事件,0 =没有事件。我想过滤掉出现频率低于某个阈值(例如100倍)的所有变量。

我已经尝试过这样的事情:

diag = luisa.T.reset_index().rename(columns = {'index': 'diagnosis'}) 

frequency = pd.concat([diag.iloc[:,:1],pd.DataFrame(diag.sum(1))], axis = 1).rename(columns = {0:'count'}) 

frequency.nlargest(150,'count) 

请帮助!

1 个答案:

答案 0 :(得分:0)

您可以按列求和,并过滤出总和低于某个特定值的列,请记住,该和代表事件的总数:

threshold = 100

col_sum = df.sum()
filtered_df = df[col_sum[col_sum > threshold].index]

这将在filtered_df中存储原始DataFrame的子集,而不包含这些列。

如果不是所有的列都是二进制的,那么您需要包括额外的步骤,即仅对二进制列执行此操作,然后反转条件以查找不能满足您要求的列条件:

binary_columns = df.isin([0, 1]).all(axis=0)
binary_df = df.loc[:, binary_columns]
col_sum = binary_df.sum()

filtered_df = df.drop(columns=col_sum[col_sum < threshold].index)