У меня есть 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 столбцами требуется несколько секунд, что делает его довольно нежизнеспособным.
Что можно сделать для повышения его эффективности?
Да, это только 1 и 0 («квази» двоичные флаги). Я проверю это решение. – Einar
Протестировано, работает красиво и на несколько порядков. Благодаря! – Einar