Я опубликовал предыдущий вопрос ( 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()