Пометить последний набор строк в сгруппированном наборе данных с помощью панд - PullRequest
0 голосов
/ 06 сентября 2018

РЕДАКТИРОВАТЬ : проблема ниже, учитывая метод df.assign(Flag=1 - df.duplicated(['id', 'quarter', 'lot'], keep='last')), предложенный ниже

 index   mkid     ordernumber quarter lotnumber1 order_xldate  Flag
441670  10176228  0108595504  2015Q2    12947-1   2015-04-09     0
441211  10176228  0108663905  2015Q2    12947-1   2015-04-29     1
450008  10176228  0108663905  2015Q2     129161   2015-04-29     1
440268  10176228  0108779992  2015Q2    12987-1   2015-05-29     0
448187  10176228  0108779992  2015Q2    12848-1   2015-05-29     1
439085  10176228  0108895691  2015Q2    12987-1   2015-06-29     1
446123  10176228  0108895691  2015Q2    12965-1   2015-06-29     1
419419  10176228  0109003405  2015Q3    12969-1   2015-07-27     1
429893  10176228  0109003405  2015Q3    12987-1   2015-07-27     1
426850  10176228  0109241988  2015Q3      13929   2015-09-15     1
384762  10176228  0109385611  2015Q4     K10127   2015-10-09     1

Поле Flag применяется к каждому ordernumber в данном квартале, не последний ordernumber. Таким образом, выше, для 2015Q2, Flag должен попадать только для обеих строк ordernumber 0108895691


ПРЕДВАРИТЕЛЬНЫЙ ПОСТ :

В настоящее время у меня есть набор данных заказов на продажу, в котором каждый ordernumber делится на лоты (т. Е. lot1, lot2 и т. Д.). Таким образом, для каждого ordernumber может быть несколько строк. Другими соответствующими столбцами являются счета id и quarter (т.е. 2018Q2). Для каждого данного id в каждом данном quarter я хочу применить флаг к всем лотам последнего ордера в данном квартале с использованием Pandas / Python. Любой совет?

В настоящее время есть:

masterDF['FLAG'] = masterDF.groupby(by=['id','quarter'],as_index=False)['ordernumber'].nth(-1)
masterDF['LAST_ORDER_OF_QUARTER'] = np.where(masterDF['FLAG'].isnull(),0,1)

Но это ставит 1 только на последнюю строку этой комбинации id / четверти / порядка, а не на все строки в данном заданном порядке, если этот номер заказа появляется более чем на один ряд.

Мой желаемый результат - иметь 1 на обоих лотах orderB

id   |   quarter   |   ordernumber   |   lot      |    Last Order of Quarter
----------------------------------------------------------------------------
A    |   2018Q1    |   orderA        |   lot1     |     0
A    |   2018Q1    |   orderB        |   lot1     |     1
A    |   2018Q1    |   orderB        |   lot2     |     1

Вместо:

id   |   quarter   |   ordernumber   |   lot      |    Last Order of Quarter
----------------------------------------------------------------------------
A    |   2018Q1    |   orderA        |   lot1     |     0
A    |   2018Q1    |   orderB        |   lot1     |     0
A    |   2018Q1    |   orderB        |   lot2     |     1

Любой совет?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Ваш групповой объект дает удобную таблицу для объединения обратно в основную. Присвойте «Последнему порядку» 1 в этой таблице, объедините его с основным и заполните NaN 0.

new = df.groupby(['id', 'quarter']).nth(-1)
del new['lot']
new['Last Order'] = 1
df = pd.merge(df, new, how='left').fillna(0)

Это дает:

    id  quarter ordernumber lot value
0   a   2018Q1  orderA  lot1    0.0
1   a   2018Q1  orderA  lot2    0.0
2   a   2018Q1  orderB  lot1    1.0
3   b   2018Q1  orderC  lot2    0.0
4   b   2018Q1  orderD  lot1    1.0
5   b   2018Q1  orderD  lot2    1.0
0 голосов
/ 06 сентября 2018

Использование duplicated

df.assign(Flag=1 - df.duplicated(['id', 'quarter', 'lot'], keep='last'))

  id quarter ordernumber   lot  Flag
0  A  2018Q1      orderA  lot1     0
1  A  2018Q1      orderB  lot1     1
2  A  2018Q1      orderB  lot2     1

То же самое

df.assign(**{'Last Order': 1 - df.duplicated(['id', 'quarter', 'lot'], keep='last')})

  id quarter ordernumber   lot  Last Order
0  A  2018Q1      orderA  lot1           0
1  A  2018Q1      orderB  lot1           1
2  A  2018Q1      orderB  lot2           1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...