Python Groupby Функция Векторизация - PullRequest
0 голосов
/ 08 ноября 2018

Я опубликовал предыдущий вопрос ( Python Groupby с булевой маской ), который дал успешный ответ:

import io
import pandas as pd

data = """ 
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
"""
data = io.StringIO(data)
df = pd.read_csv(data, parse_dates=['orig_date', 'fix_date'])

def f(g):
    min_fix_date = g['fix_date'].min()
    if pd.isnull(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))

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

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

Однако сейчас я пытаюсь разработать оптимизированную / векторизованную версию для улучшения времени выполнения и масштабирования до более крупных наборов данных.Любые советы или хитрость будут приветствоваться!В настоящее время я экспериментирую с пандами .idxmin() и numpy .argmin()

1 Ответ

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

Делает ли это то, что вы хотите?

df.groupby(['id','atr1','atr2']).apply(lambda x: (x.orig_date < pd.to_datetime(x.fix_date.min()))
                                .astype(int)).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...