#pandas
#pandas
Вопрос:
Рассмотрим следующий фрейм данных:
ID Column
0 500 2
1 500 2
2 500 2
3 500 2
4 500 2
5 500 4
Как мы можем увидеть, появляется ли наиболее распространенное значение столбца более X% раз?
Я пытался сделать: df.locate[df.groupby('ID')['Column'].count_values(normalize=True).max() > X]
, но я получаю сообщение об ошибке.
Ответ №1:
Я думаю, что то, что у вас было, было близко к решению. Мне не совсем понятно, хотите ли вы вычислить это только для всего столбца или для каждой группы, так что вот решение для обоих. Вы можете изменить переменную at_least_this_proportion
, чтобы изменить минимальный порог:
import pandas as pd
from io import StringIO
text = """
ID Column
0 500 2
1 500 2
2 500 2
3 500 2
4 500 2
5 500 4
6 501 2
7 501 2
"""
df = pd.read_csv(StringIO(text), header=0, sep='s ')
# set minimum threshold
at_least_this_proportion = 0.5
Вычисление для каждой группы:
# find the value that occurs at least 50% within its group
value_counts_per_group = df.groupby('ID')['Column'].value_counts(normalize=True)
ids_that_meet_threshold = value_counts_per_group[value_counts_per_group > at_least_this_proportion].index.get_level_values(0)
# get all rows for which the id meets the threshold
df[df['ID'].isin(ids_that_meet_threshold)]
Комментарии:
1. Я не уточнил это должным образом. Я хотел второе (т. Е. Для каждой группы). Спасибо, что предоставили оба варианта! Однако я бы хотел, чтобы на выходе были все строки, идентификатор которых соответствует условию. В приведенном вами примере все строки удовлетворяют этому условию. То есть даже 5-я строка (500 4) будет True и, таким образом, будет возвращена.
2. хорошо, изменено решение: поиск идентификаторов, соответствующих пороговому значению, и получение всех строк для этих идентификаторов