Хобрук: Ваш путь к мастерству в программировании

Лямбда с Apply и Groupby

Я пытаюсь вычислить уникальные значения в столбце кадра данных pandas, сгруппированного вторым столбцом, и вернуть результаты в виде нового столбца в кадре данных.

Когда я тестирую эту операцию на следующем кадре данных, она возвращает нулевые значения.

df = pd.DataFrame([('bird', 'Falconiformes', 389.0),   ('bird', 'Psittaciformes', 24.0),   ('mammal', 'Carnivora', 80.2),   ('mammal', 'Primates', np.nan),   ('mammal', 'Carnivora', 58)],   index=['falcon', 'parrot', 'lion', 'monkey', 'leopard'],columns=('class', 'order', 'max_speed'))

В пандах 0.18 я использовал

df['test'] = df.groupby('class').transform('unique')
Traceback (most recent call last):

  File "<ipython-input-146-283294ac8bef>", line 1, in <module>
    df['test'] = df.groupby('class').transform('unique')

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\generic.py", line 1469, in transform
    raise ValueError(msg)

ValueError: 'unique' is not a valid function name for transform(name)

но мой администратор недавно обновил pandas и unique больше не является допустимой функцией для преобразования. Существует ветка, предлагающая подать заявку на pandas 1.1.3 (см. обсуждение). Я просмотрел новую документацию для 1.1.3 и попытался использовать следующие

df['test']=df.groupby('class').apply(lambda x: x['max_speed'].unique())
df
Out[135]: 
     index   class           order  max_speed test
0   falcon    bird   Falconiformes      389.0  NaN
1   parrot    bird  Psittaciformes       24.0  NaN
2     lion  mammal       Carnivora       80.2  NaN
3   monkey  mammal        Primates        NaN  NaN
4  leopard  mammal       Carnivora       58.0  NaN

но применить не расширяет значение на другие строки, хотя

df.groupby('class').apply(lambda x: x['max_speed'].unique())
Out[140]: 
class
bird          [389.0, 24.0]
mammal    [80.2, nan, 58.0]
dtype: object

Если я попытаюсь добавить ключевые слова, упомянутые в последнем применить документацию Я получаю сообщение об ошибке.

 df['test']=df.groupby('class').apply(lambda x: x['max_speed'].unique(), result_type='expand')
Traceback (most recent call last):
 File "<ipython-input-145-9b84754c6daf>", line 1, in <module>
    df['test']=df.groupby('class').apply(lambda x: x['max_speed'].unique(), result_type='expand')

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 870, in apply
    return self._python_apply_general(f, self._selected_obj)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 892, in _python_apply_general
    keys, values, mutated = self.grouper.apply(f, data, self.axis)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\ops.py", line 213, in apply
    res = f(group)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 843, in f
    return func(g, *args, **kwargs)

TypeError: <lambda>() got an unexpected keyword argument 'result_type'

Я знаю, что могу использовать groupby с агрегатом и уникальной функцией и снова объединить полученный фрейм данных. Но мне нужно выполнить эту операцию для нескольких разных группировок, и я бы предпочел однострочный ответ.


  • Каков ожидаемый результат? 23.11.2020
  • Ожидаемый результат - это то, что дает ответ Питербарга. 24.11.2020

Ответы:


1

это немного хакерски, но я думаю, что это дает вам то, что вы хотите

df.groupby('class').apply(lambda d: d.assign(Test = [d['max_speed'].unique()]*len(d)))

производит

|                       | class   | order          |   max_speed | Test             |
|:----------------------|:--------|:---------------|------------:|:-----------------|
| ('bird', 'falcon')    | bird    | Falconiformes  |       389   | [389.  24.]      |
| ('bird', 'parrot')    | bird    | Psittaciformes |        24   | [389.  24.]      |
| ('mammal', 'lion')    | mammal  | Carnivora      |        80.2 | [80.2  nan 58. ] |
| ('mammal', 'monkey')  | mammal  | Primates       |       nan   | [80.2  nan 58. ] |
| ('mammal', 'leopard') | mammal  | Carnivora      |        58   | [80.2  nan 58. ] |

хитрость заключается в том, чтобы убедить assign, что d['max_speed'].unique()должно быть реплицировано во всех соответствующих строках — для этого мы передаем список длины len(d), который имеет один и тот же элемент d['max_speed'].unique() для всех записей. Здесь d — это каждый подкадр данных в groupby

23.11.2020
  • Большое спасибо Питербарг. Это то, что мне нужно. Я не был знаком с функцией назначения, но мне нравится подбирать что-то новое. Кроме того, это должно быть достаточно быстро для моего приложения (строки gt1M). 24.11.2020
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..