Python, поиск целевого значения набора данных

У меня есть образец набора данных. Вот:

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

И его вывод здесь:

Python, поиск целевого значения набора данных

Моя цель - найти значение 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

И вот ожидаемый результат:

Python, поиск целевого значения набора данных

Итак, если существует значение Dist меньше 5, я хотел бы взять максимальную из этих групп. Если нет, то я хотел бы взять мин. надеюсь будет понятно.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку вы используете pandas DataFrame, вы можете использовать синтаксис скобок для фильтрации данных

В твоем случае:

df[df['Dist']] < 5

Что касается второй части вопроса, это было немного запутанно, можете ли вы подробнее объяснить «взять максимальную одну из этих групп. Если нет, я бы хотел взять минимальную».

Ты прав. Вторая часть была сбита с толку.:/ Я имею в виду, давайте рассмотрим группу 50, в этой группе значения dist равны 4, 6 и 2. Таким образом, есть значение меньше 5. Поэтому я хочу взять самое большое значение dist в этой группе, которое равно 4. Я рассматриваю только менее 5 значений. И давайте рассмотрим группу точки 45, в этой группе нет значения расстояния меньше 5, поэтому я хочу взять наименьшее значение расстояния, равное 7. Надеюсь, это будет понятнее.

justLearner 06.04.2022 15:19

Вам нужно взять эти значения и сохранить их в виде списка, нужна ссылка, такая как dict (например: {50:4, 45:7}), или вам нужен фрейм данных? А для групп с максимальным значением Dist, равным 5, должно возвращаться минимальное или максимальное значение?

Jhones 06.04.2022 15:34
Ответ принят как подходящий

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 в процессе, если это нежелательно, можно создать функцию для сортировки фрейма данных таким образом и применить ее для каждой группы. Дайте мне знать, если это так

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