У меня есть образец набора данных. Вот:
import pandas as pd
import numpy as np
df = {'Point1': [50,50,50,45,45,35,35], 'Point2': [48,44,30,35,33,34,32], 'Dist': [4,6,2,7,8,3,6]}
df = pd.DataFrame(df)
df
И его вывод здесь:
Моя цель - найти значение dist с его условием и значением point2 для каждой группы point1. Вот мой код. (Выдает ошибку)
if df['dist'] < 5 :
df1 = df[df['dist'].isin(df.groupby('Point1').max()['Dist'].values)]
else :
df1 = df[df['dist'].isin(df.groupby('Point1').min()['Dist'].values)]
df1
И вот ожидаемый результат:
Итак, если существует значение Dist меньше 5, я хотел бы взять максимальную из этих групп. Если нет, то я хотел бы взять мин. надеюсь будет понятно.
Поскольку вы используете pandas DataFrame, вы можете использовать синтаксис скобок для фильтрации данных
В твоем случае:
df[df['Dist']] < 5
Что касается второй части вопроса, это было немного запутанно, можете ли вы подробнее объяснить «взять максимальную одну из этих групп. Если нет, я бы хотел взять минимальную».
Вам нужно взять эти значения и сохранить их в виде списка, нужна ссылка, такая как dict (например: {50:4, 45:7}
), или вам нужен фрейм данных? А для групп с максимальным значением Dist, равным 5, должно возвращаться минимальное или максимальное значение?
IIUC, вы хотите найти ближайший Dist к 5 с приоритетом для значений ниже 5.
Для этого вы можете вычислить два столбца, чтобы помочь вам отсортировать значения в порядке приоритета и взять первый. Здесь 'cond' сначала сортируется по ≤5, затем >5 и cond2 по абсолютному расстоянию до 5.
thresh = 5
(df
.assign(cond=df['Dist'].gt(thresh),
cond2=df['Dist'].sub(thresh).abs(),
)
.sort_values(by=['cond', 'cond2'])
.groupby('Point1', as_index=False).first()
.drop(columns=['cond', 'cond2'])
)
выход:
Point1 Point2 Dist
0 35 34 3
1 45 35 7
2 50 48 4
NB. это также сортировка по Point1 в процессе, если это нежелательно, можно создать функцию для сортировки фрейма данных таким образом и применить ее для каждой группы. Дайте мне знать, если это так
Ты прав. Вторая часть была сбита с толку.:/ Я имею в виду, давайте рассмотрим группу 50, в этой группе значения dist равны 4, 6 и 2. Таким образом, есть значение меньше 5. Поэтому я хочу взять самое большое значение dist в этой группе, которое равно 4. Я рассматриваю только менее 5 значений. И давайте рассмотрим группу точки 45, в этой группе нет значения расстояния меньше 5, поэтому я хочу взять наименьшее значение расстояния, равное 7. Надеюсь, это будет понятнее.