моя группа () не работает в панде dataframe - PullRequest
0 голосов
/ 21 февраля 2019

Я должен сделать группу очень простой, но в моем случае это не работает.Я не могу воспроизвести фактические данные, но предположим, что мой DF:

              Cod          Cost        Date                 VAL
0            A123          123         2017-12-21           0.0
1            A123          123         2017-12-21          -2.0
2            A123          123         2017-12-21         -10.0
3            FB00          180         2016-12-11          80.0
4            FB00          180         2016-12-11          80.0    

Я должен сделать групповую операцию для Cod, Cost и Date и получить соответствующий минимум VAL с помощью reset_index ().Мой код:

DF = DF.groupby(['Cod', 'Cost','Date'])['VAL'].min().reset_index()

Ожидается:

              Cod          Cost        Date                 VAL
0            A123          123         2017-12-21         -10.0
1            FB00          180         2016-12-11          80.0

, но возвращается:

              Cod          Cost        Date                 VAL
0            A123          123         2017-12-21           0.0
1            A123          123         2017-12-21           0.0
2            A123          123         2017-12-21          80.0
3            FB00          180         2016-12-11          80.0
4            FB00          180         2016-12-11          80.0 

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

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

Начало работыреплицируя ваш фрейм данных

df = pd.DataFrame([['A123', 123, '2017-12-21', 0], ['A123', 123, '2017-12-21', -2], ['A123', 123, '2017-12-21', -10], ['FB00', 180, '2016-12-11', 80], ['FB00', 180, '2016-12-11', 80]], columns=['Cod', 'Cost', 'Date', 'VAL'])

Затем мы можем отсортировать значения по Cod, Cost, Date и VAL

df.sort_values(['Cod', 'Cost', 'Date', 'VAL'], ascending=True, inplace=True)

Вывод:

    Cod     Cost   Date     VAL
2   A123    123 2017-12-21  -10
1   A123    123 2017-12-21  -2
0   A123    123 2017-12-21  0
3   FB00    180 2016-12-11  80
4   FB00    180 2016-12-11  80

Затем мы можемотбросьте дубликаты Cod, Cost and Dates, сохраняя первую запись (наименьшее значение), оставляя нам ожидаемый результат.

df.drop_duplicates(['Cod', 'Cost', 'Date'], keep='first', inplace=True)
df.reset_index(drop=True, inplace=True)

С выводом:

    Cod     Cost    Date    VAL
0   A123    123 2017-12-21  -10
1   FB00    180 2016-12-11  80

Очень хакерский, не рекомендуется, но должен получить ожидаемый результат.

0 голосов
/ 21 февраля 2019

Я только что смоделировал ваш образец и его работы для меня:

Пример образца:

>>> df
    Cod  Cost        Date   VAL
0  A123   123  2017-12-21   0.0
1  A123   123  2017-12-21  -2.0
2  A123   123  2017-12-21 -10.0
3  FB00   180  2016-12-11  80.0
4  FB00   180  2016-12-11  80.0

Результат:

>>> df.groupby(['Cod', 'Cost','Date'])['VAL'].min().reset_index()                                                                                                            Cod  Cost        Date   VAL
0  A123   123  2017-12-21 -10.0
1  FB00   180  2016-12-11  80.0

Применимо к пандам:0.23.3

Альтернатива:

Вы также можете применить, как показано ниже:

>>> df.groupby(['Cod', 'Cost','Date']).min().reset_index()
    Cod  Cost        Date   VAL
0  A123   123  2017-12-21 -10.0
1  FB00   180  2016-12-11  80.0

Он также должен работать с 0.18.1:

Python 3.5.1 (default, May 25 2016, 07:19:16)
[GCC 4.8.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> pd.__version__
'0.18.1'

Образец

>>> df
    Cod  Cost        Date   VAL
0  A123   123  2017-12-21   0.0
1  A123   123  2017-12-21  -2.0
2  A123   123  2017-12-21 -10.0
3  FB00   180  2016-12-11  80.0
4  FB00   180  2016-12-11  80.0
>>> df.groupby(['Cod', 'Cost','Date']).min().reset_index()
    Cod  Cost        Date   VAL
0  A123   123  2017-12-21 -10.0
1  FB00   180  2016-12-11  80.0

ИЛИ

>>> df.groupby(['Cod', 'Cost','Date'])['VAL'].min().reset_index()
    Cod  Cost        Date   VAL
0  A123   123  2017-12-21 -10.0
1  FB00   180  2016-12-11  80.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...