Цикл для поиска минимальных значений на основе другого значения столбца и объединения в 1 кадр данных?

#python #pandas

Вопрос:

Представьте себе фрейм данных, подобный этому:

 import pandas as pd list ={'Security ID':['3e09ax', 'we9lkl', 'as42we','as5322', 'ot24tas', 'c34ci46a8'],  'Industry':['Airplanes', 'Airplanes', 'Oil', 'Oil', 'Housing', 'Trucking'],  'Amount outstanding':[33, 31, 39, 21, 29, 29]} df = pd.DataFrame(list)  

»’

Конечная цель состоит в том, чтобы вернуть строки для каждой отрасли с наименьшей (минимальной) суммой задолженности в фрейм данных «Минимальное значение» для ежедневного отчета

по сути это так, но для каждой отрасли:

 df[df['Amount outstanding'] == df['Amount outstanding'].min()]  

Первый шаг-снова ввести уникальные значения для [отрасли] в список, а затем создать функцию цикла, которая делает это.

Не знаю точно, как это сделать. Этот фрейм данных на самом деле представляет собой 100 000 строк с 30 отраслями, которые меняются ежедневно.

Комментарии:

1. df.groupby('Industry')['Amount outstanding'].min() ?

2. Это не возвращает уникальный идентификатор (первый столбец). В конечном счете, этот отчет должен иметь ту же структуру фреймов данных, но с минимальными значениями для каждой отрасли.

3. df[df['Amount outstanding'].eq(df.groupby('Industry')['Amount outstanding'].transform(min))]

4. Не могли бы вы, пожалуйста, указать ваши ожидаемые результаты? Например, в «нефтяной» отрасли есть два идентификатора безопасности. Какой из них (или оба?) должен быть в выводе?

5. @It_is_Chris это сработало идеально. Спасибо

Ответ №1:

IIUC, вы хотите groupby и transform :

 output = df[df['Amount outstanding']==df.groupby('Industry')['Amount outstanding'].transform(min)]  gt;gt;gt; output   Security ID Industry Amount outstanding 1 we9lkl Airplanes 31 3 as5322 Oil 21 4 ot24tas Housing 29 5 c34ci46a8 Trucking 29  

Ответ №2:

 df['B']=df['Amount outstanding']  df.groupby('Industry', group_keys=False).apply(lambda x: x.loc[x.B.idxmin()])  

это дает вам новый фрейм данных только с минимальным значением в столбце «Сумма задолженности». Если вы хотите, вы можете удалить сейчас столбец «B».

Ответ №3:

 df.loc[df.groupby('Industry')['Amount outstanding'].idxmin()]