Выберите строки на основе частоты значений в столбце; однострочно или быстрее? - PullRequest
0 голосов
/ 07 июня 2019

Я хочу выполнить задачу разделения, но для этого требуется минимальное количество выборок на класс, поэтому я хочу отфильтровать Dataframe по столбцу, который идентифицирует метки классов. Если частота появления класса ниже некоторого порога, то мы хотим отфильтровать это.

>>> df = pd.DataFrame([[1,2,3], [4,5,6], [0,0,6]])
>>> df
   0  1  2
0  1  2  3
1  4  5  6
2  0  0  6

>>> filter_on_col(df, col=2, threshold=6)  # Removes first row
   0  1  2
0  4  5  6
1  0  0  6

Я могу сделать что-то вроде df[2].value_counts(), чтобы получить частоту каждого значения в столбце 2, и затем я могу выяснить, какие значения превышают мое пороговое значение просто:

>>>`df[2].value_counts() > 2`
 3      False
 6      True

и тогда логика выяснения всего остального довольно проста.

Но я чувствую, что здесь есть элегантный однострочный панд, который я могу сделать, или, возможно, более эффективный метод.

Мой вопрос очень похож на: Выбор строк в DataFrame на основе значений в столбце в пандах , но сложность заключается в том, что я полагаюсь на частоту значений, а не на сами значения.

1 Ответ

1 голос
/ 07 июня 2019

Итак, это одна строка:

# Assuming the parameters of your specific example posed above.
col=2; thresh=2

df[df[col].isin(df[col].value_counts().get(thresh).loc[lambda x : x].index)]

Out[303]: 
   0  1  2
1  4  5  6
2  0  0  6

Или другая строка:

df[df.groupby(col)[col].transform('count')>thresh,]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...