Эквивалент Pandas idxmin для среднего значения

Я пытаюсь отфильтровать очень большой фрейм данных, который выглядит следующим образом:

уникальный идентификатор Икс й 1 1 2 1 2 3 1 3 4 2 1 2 2 2 3 2 3 4

чтобы содержать только средние значения для каждого уникального идентификатора (например, отфильтрованного по «x»), например:

уникальный идентификатор Икс й 1 2 3 2 2 3

Я попытался отфильтровать данные, выполнив следующие действия:

filtered_series = df.groupby("uniqueID")[some_column].mean()

Тогда вопрос в том, как я могу отфильтровать исходный фрейм данных на основе приведенной выше серии.

Теперь я пытаюсь получить исходный фрейм данных, содержащий множество строк (очевидно, один и тот же идентификатор может появляться много раз), но только с одной строкой на уникальный идентификатор.

Я пробовал много вещей, в том числе такое внутреннее соединение:

df.merge(filtered_series, how = "inner", on=["uniqueID", some_column])

Как ни странно, это привело к еще большему количеству строк в моем df вместо того, чтобы фильтровать их.

Мне удалось быстро выполнить ту же задачу по поиску минимального/максимального значения, что легко достигается с помощью следующего кода:

new_df = df.loc[df.groupby("uniqueID")[some_column].idxmin/max()]

Очевидно, что функции idxmean не существует, но, возможно, есть удобный способ добиться того же результата. Спасибо за помощь!

Вы ведь знаете, что среднее значение не обязательно является выборкой данных, верно? например среднее значение 1, 2 равно 1.5. Эта задача имеет смысл только в том случае, если она гарантированно будет образцом, и я не уверен, почему это так. Может быть, вам действительно нужен этот режим? Или, может быть, вам нужно значение, наиболее близкое к среднему?

wjandrea 26.06.2024 01:11

Пожалуйста, напишите более конкретное название; см. Как спрашивать советы.

wjandrea 26.06.2024 01:16

@wjandrea да, мне нужно значение, наиболее близкое к среднему (т. е. если образец = (1,2), я хочу либо 1, либо 2

Razrer 26.06.2024 08:15

Хорошо, пожалуйста, отредактируйте, чтобы уточнить это.

wjandrea 26.06.2024 16:42
0
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC, вы можете создать новый столбец с отличием от среднего значения, использовать idxmin для получения индексов, а затем использовать его для фильтрации исходного кадра данных:

mean = df.groupby("unique id")["x"].transform("mean")
df["diff_from_mean"] = (df["x"] - mean).abs()
idx_mean = df.groupby("unique id")["diff_from_mean"].idxmin()
df = df.loc[idx_mean].drop(columns = "diff_from_mean")
   unique id  x  y
1          1  2  3
4          2  2  3

Вам не нужно использовать временный столбец. Ты мог бы просто сделать diff_from_mean = mean.rsub(df['x']).abs() тогда idx_mean = diff_from_mean.groupby(df['unique id']).idxmin()

wjandrea 26.06.2024 16:51

Другие вопросы по теме

Изменить/создать столбец на основе групп, определенных извне
Как сортировать пары столбцов в R, сохраняя связанные значения вместе
Вложен ifelse в R с предупреждением «условие имеет длину > 1»
Есть ли лучший способ создать мой фрейм данных?
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Добавьте значения двух Dataframe на основе похожих значений строк
Обмен датой начала, датой окончания и другими столбцами с более ранней строкой, если даты больше 8 в фрейме данных pandas
Почему сбор LazyFrame перед объединением в Polars решает мою проблему с несоответствиями индексов?
Python: только 2 уникальных имени столбца в фрейме данных, всего 3105 столбцов. Как получить среднее значение строки, сгруппированной по уникальному имени столбца
Как я могу сравнить значение в одном столбце со всеми значениями, которые находятся ДО него в другом столбце, чтобы найти количество уникальных значений, которые меньше?