slice original df после groupby (). nlargest (x) операция

Учитывая проблемы с groupby() и nlargest() как описано здесь и здесь . Я пытаюсь решить проблемы.

Примечание: для простоты я использовал nlargest(1) , однако это могло быть любое количество выборов.

  • Как выполнить GROUP BY ... COUNT или SUM в Django ORM?
  • pandas groupby сортировать по группам
  • Применение нескольких функций к нескольким столбцам группы
  • Как извлечь числовые диапазоны из 2 столбцов, содержащих числовые последовательности, и напечатать диапазон из обоих столбцов (разные значения прироста)?
  • Groupby на основе значения в предыдущей строке
  • Результаты расчета Pandas GroupBy
  •  {'city1': {0: 'Chicago', 1: 'Chicago', 2: 'Chicago', 3: 'Chicago', 4: 'Miami', 5: 'Houston', 6: 'Austin'}, 'city2': {0: 'Toronto', 1: 'Detroit', 2: 'St.Louis', 3: 'Miami', 4: 'Dallas', 5: 'Dallas', 6: 'Dallas'}, 'p234_r_c': {0: 5.0, 1: 4.0, 2: 2.0, 3: 0.5, 4: 1.0, 5: 4.0, 6: 3.0}, 'plant1_type': {0: 'COMBCYCL', 1: 'COMBCYCL', 2: 'NUKE', 3: 'COAL', 4: 'NUKE', 5: 'COMBCYCL', 6: 'COAL'}, 'plant2_type': {0: 'COAL', 1: 'COAL', 2: 'COMBCYCL', 3: 'COMBCYCL', 4: 'COAL', 5: 'NUKE', 6: 'NUKE',}} 

    A) groupby city1 и строки возврата, выбранные из оригинала df

     cols2 = ['city1','plant1_type','plant2_type'] df.loc[df2.groupby(cols2)['p234_r_c'].nlargest(1).reset_index().level_3] city1 city2 p234_r_c plant1_type plant2_type 6 Austin Dallas 3.0 COAL NUKE 3 Chicago Miami 0.5 COAL COMBCYCL 0 Chicago Toronto 5.0 COMBCYCL COAL 2 Chicago St.Louis 2.0 NUKE COMBCYCL 5 Houston Dallas 4.0 COMBCYCL NUKE 4 Miami Dallas 1.0 NUKE COAL 

    Вышеприведенное выглядит хорошо

    B) groupby city2 и возвращать строки, выбранные из оригинала df

    Так как тот же код, используемый в #A, генерирует фиктивный результат, если попытался для groupby city2 , было предложено обходное решение:

     cols = ['city2','plant1_type','plant2_type'] df.set_index(cols).groupby(level=cols)['p234_r_c'].nlargest(1) city2 plant1_type plant2_type Toronto COMBCYCL COAL 5.0 Detroit COMBCYCL COAL 4.0 St.Louis NUKE COMBCYCL 2.0 Miami COAL COMBCYCL 0.5 Dallas NUKE COAL 1.0 COMBCYCL NUKE 4.0 COAL NUKE 3.0 

    Теперь, как я могу использовать этот результат для возврата строк, выбранных из исходного df, как это было в #A?

    Примечание : если в исходном df была добавлена ​​дополнительная строка, в результате которой groupby.nlargest() для city2 имел группы, в которых по крайней мере одна группа имела размер больше 1, тогда код в #A можно использовать для #B .

  • Повторная почасовая настройка TimeSeries с определенным стартовым часом
  • Добавление прогнозируемых значений и остатков в pandas dataframe
  • Импортируйте несколько файлов excel в pandon pandas и объедините их в один фрейм данных
  • Кажется, что Pandas игнорирует имя первого столбца при чтении данных с разделителями-табуляторами, дает KeyError
  • NumPy или Pandas: сохранение типа массива как целого с использованием значения NaN
  • Панды, как применять несколько функций к кадру данных
  • One Solution collect form web for “slice original df после groupby (). nlargest (x) операция”

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

    Метод №1: использовать loc и idxmax :

     In [21]: df.loc[df.groupby(cols2)["p234_r_c"].idxmax()] Out[21]: city1 city2 p234_r_c plant1_type plant2_type 6 Austin Dallas 3.0 COAL NUKE 3 Chicago Miami 0.5 COAL COMBCYCL 0 Chicago Toronto 5.0 COMBCYCL COAL 2 Chicago St.Louis 2.0 NUKE COMBCYCL 5 Houston Dallas 4.0 COMBCYCL NUKE 4 Miami Dallas 1.0 NUKE COAL In [22]: df.loc[df.groupby(cols)["p234_r_c"].idxmax()] Out[22]: city1 city2 p234_r_c plant1_type plant2_type 6 Austin Dallas 3.0 COAL NUKE 5 Houston Dallas 4.0 COMBCYCL NUKE 4 Miami Dallas 1.0 NUKE COAL 1 Chicago Detroit 4.0 COMBCYCL COAL 3 Chicago Miami 0.5 COAL COMBCYCL 2 Chicago St.Louis 2.0 NUKE COMBCYCL 0 Chicago Toronto 5.0 COMBCYCL COAL 

    Метод № 2: сортировка по p234_r_c и использование last :

     In [17]: df.sort_values("p234_r_c").groupby(cols2, as_index=False).last() Out[17]: city1 plant1_type plant2_type city2 p234_r_c 0 Austin COAL NUKE Dallas 3.0 1 Chicago COAL COMBCYCL Miami 0.5 2 Chicago COMBCYCL COAL Toronto 5.0 3 Chicago NUKE COMBCYCL St.Louis 2.0 4 Houston COMBCYCL NUKE Dallas 4.0 5 Miami NUKE COAL Dallas 1.0 In [18]: df.sort_values("p234_r_c").groupby(cols, as_index=False).last() Out[18]: city2 plant1_type plant2_type city1 p234_r_c 0 Dallas COAL NUKE Austin 3.0 1 Dallas COMBCYCL NUKE Houston 4.0 2 Dallas NUKE COAL Miami 1.0 3 Detroit COMBCYCL COAL Chicago 4.0 4 Miami COAL COMBCYCL Chicago 0.5 5 St.Louis NUKE COMBCYCL Chicago 2.0 6 Toronto COMBCYCL COAL Chicago 5.0 

    Если вы хотите иметь возможность получить несколько ответов, а в то время как nlargest и nsmallest будут разбиты, я думаю, что это проще всего сортировать, а затем использовать голову или хвост. Например:

     In [27]: df.sort_values("p234_r_c").groupby(cols, as_index=False).tail(2) Out[27]: city1 city2 p234_r_c plant1_type plant2_type 3 Chicago Miami 0.5 COAL COMBCYCL 4 Miami Dallas 1.0 NUKE COAL 2 Chicago St.Louis 2.0 NUKE COMBCYCL 6 Austin Dallas 3.0 COAL NUKE 1 Chicago Detroit 4.0 COMBCYCL COAL 5 Houston Dallas 4.0 COMBCYCL NUKE 0 Chicago Toronto 5.0 COMBCYCL COAL 
    Python - лучший язык программирования в мире.