Выберите максимальное значение специального условия в пандах? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть DataFrame вроде

customer_id    product_code    No_visits
1              90              15
1              105             30
1              100             45
2              50              60
2              100             45
2              10              30

Я хочу выбрать customer_id, код продукта, соответствующий наибольшему no_visits

customer_id    product_code    No_visits
1              100             45
2              50              60

df.groupby('customer_id')['product_code, no_visits'].max()

, который дает мне результаты максимумов product_code и max no_visits, которые абсолютно не то, что я хочу. Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Еще один вариант:

In [93]: (df.groupby('customer_id', as_index=False)
            .apply(lambda x: x.nlargest(1,'No_visits'))
            .reset_index(level=0, drop=True))
Out[93]:
   customer_id  product_code  No_visits
2            1           100         45
3            2            50         60

или гораздо более приятный вариант от @ piRSquared :

In [49]: pd.concat((d.nlargest(1, 'No_visits') for _, d in df.groupby('customer_id')))
Out[49]:
   customer_id  product_code  No_visits
2            1           100         45
3            2            50         60
0 голосов
/ 29 апреля 2018

Это то, для чего idxmax. Возьмите индекс максимального значения, затем используйте этот индекс при вызове loc.

Это даст результаты, идентичные MaxU, но потенциально отличающиеся от AmiTavory. Результаты Ami могут давать более одного результата на customer_id, если имеется более одной строки, значение No_visits которой равно максимальному значению. В ответах Mine и MaxU будет выбран тот, который был первым, и он равен максимальному.

df.loc[df.groupby('customer_id').No_visits.idxmax()]

   customer_id  product_code  No_visits
2            1           100         45
3            2            50         60
0 голосов
/ 28 апреля 2018

Вы можете использовать

>>> df[df.No_visits == df.No_visits.groupby(df.customer_id).transform(max)]

   customer_id  product_code  No_visits
2            1           100         45
3            2            50         60

Объяснение

df.No_visits == df.No_visits.groupby(df.customer_id).transform(max)

находит для каждой строки максимальное количество посещений для идентификатора клиента этой строки. Затем вы просто фильтруете по строкам те, где количество посещений равно этому числу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...