Я пытаюсь отфильтровать очень большой фрейм данных, который выглядит следующим образом:
чтобы содержать только средние значения для каждого уникального идентификатора (например, отфильтрованного по «x»), например:
Я попытался отфильтровать данные, выполнив следующие действия:
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 не существует, но, возможно, есть удобный способ добиться того же результата. Спасибо за помощь!
Пожалуйста, напишите более конкретное название; см. Как спрашивать советы.
@wjandrea да, мне нужно значение, наиболее близкое к среднему (т. е. если образец = (1,2), я хочу либо 1, либо 2
Хорошо, пожалуйста, отредактируйте, чтобы уточнить это.
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()
Вы ведь знаете, что среднее значение не обязательно является выборкой данных, верно? например среднее значение
1, 2
равно1.5
. Эта задача имеет смысл только в том случае, если она гарантированно будет образцом, и я не уверен, почему это так. Может быть, вам действительно нужен этот режим? Или, может быть, вам нужно значение, наиболее близкое к среднему?