2014-10-22 2 views
1

У меня есть DataFrame, который, упрощено, может выглядеть следующим образом:Панда: эффективно исключить строки на основе критериев, охватывающих все столбцы

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

И так далее. Что мне нужно сделать, это удалить строк, где «1» присутствует в более чем 50% столбцов.

Я придумал эту функцию, используя 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) 

Проблема в том, что это очень медленный. На 50K линии DataFrame с 24 столбцами требуется несколько секунд, что делает его довольно нежизнеспособным.

Что можно сделать для повышения его эффективности?

ответ

2

Если значения действительно равны 1 и 0, вы можете попробовать использовать df.sum(axis=1), а затем проверить, превышает ли сумма больше половины числа столбцов. Например, если у вас есть 10 столбцов, сделайте df[df.sum(axis=1)<=5].

+0

Да, это только 1 и 0 («квази» двоичные флаги). Я проверю это решение. – Einar

+0

Протестировано, работает красиво и на несколько порядков. Благодаря! – Einar

Смежные вопросы