Python Groupby с булевой маской - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть файл данных pandas со следующим общим форматом:

id,atr1,atr2,orig_date,fix_date
1,bolt,l,2000-01-01,nan
1,screw,l,2000-01-01,nan
1,stem,l,2000-01-01,nan
2,stem,l,2000-01-01,nan
2,screw,l,2000-01-01,nan
2,stem,l,2001-01-01,2001-01-01
3,bolt,r,2000-01-01,nan
3,stem,r,2000-01-01,nan
3,bolt,r,2001-01-01,2001-01-01
3,stem,r,2001-01-01,2001-01-01

Этот результат будет следующим:

id,atr1,atr2,orig_date,fix_date,failed_part_ind
1,bolt,l,2000-01-01,nan,0
1,screw,l,2000-01-01,nan,0
1,stem,l,2000-01-01,nan,0
2,stem,l,2000-01-01,nan,1
2,screw,l,2000-01-01,nan,0
2,stem,l,2001-01-01,2001-01-01,0
3,bolt,r,2000-01-01,nan,1
3,stem,r,2000-01-01,nan,1
3,bolt,r,2001-01-01,2001-01-01,0
3,stem,r,2001-01-01,2001-01-01,0

Любые советы и рекомендации приветствуются!

Update2:

Лучший способ описать, что мне нужно сделать, - это создать в .groupby(['id','atr1','atr2']) новый столбец индикатора, в котором для записей внутри групп будут соблюдаться следующие критерии:

(df['orig_date'] < df['fix_date'])

1 Ответ

0 голосов
/ 01 ноября 2018

Я думаю, что это должно работать:

df['failed_part_ind'] = df.apply(lambda row: 1 if ((row['id'] == row['id']) &
                                                (row['atr1'] == row['atr1']) &
                                                (row['atr2'] == row['atr2']) &
                                                (row['orig_date'] < row['fix_date']))
                                            else 0, axis=1) 

Обновление: Я думаю, это то, что вы хотите:

import numpy as np
def f(g):
    min_fix_date = g['fix_date'].min()
    if np.isnan(min_fix_date):
        g['failed_part_ind'] = 0
    else:
        g['failed_part_ind'] = g['orig_date'].apply(lambda d: 1 if d < min_fix_date else 0)
    return g

df.groupby(['id', 'atr1', 'atr2']).apply(lambda g: f(g))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...