Pandas:根据跨越所有列的标准有效地排除行

时间:2014-10-22 07:08:52

标签: python optimization pandas

我有一个DataFrame,简化后可以看起来像这样:

ID     A    B    C
ID_1   0    1    1
ID_2   0    0    0
ID_3   1    1    0

等等。我需要做的是删除行,其中超过50%的列中存在“1”。

我使用apply

提出了这个功能
def thresh_filter(value):
    counts = value.value_counts(True) # Fraction based counts
    if (counts.index == 1).any():
        # Some rows are all 0s
        return counts[1] > 0.50
    else:
        return False

为了加快速度,我也尝试了这个解决方案:

def thresh_filter(value):
    counts = value.value_counts(True)
    max_idx = counts.idxmax()
    max_percentage = counts.max()
    return max_idx == 1 and max_percentage > 0.50

然后将其与

一起使用
result = mydf.apply(thresh_filter, axis=1)

问题是它非常慢。在具有24列的50K线DataFrame上,它需要几秒钟,这使得它非常不可行。

可以采取哪些措施来提高效率?

1 个答案:

答案 0 :(得分:2)

如果值实际上只有1和0,您可以尝试使用df.sum(axis=1),然后检查总数是否大于列数的一半。例如,如果您有10列,请执行df[df.sum(axis=1)<=5]