groupby и обрезать несколько строк в зависимости от условия - PullRequest
2 голосов
/ 08 мая 2020

У меня есть примерно такой фрейм данных:

df = pd.DataFrame({"ID":[1,1,2,2,2,3,3,3,3,3], 
               "IF_car":[1,0,0,1,0,0,0,1,0,1],
               "IF_car_history":[0,0,0,1,0,0,0,1,0,1],  
               "observation":[0,0,0,1,0,0,0,2,0,3]}) 

Мне нужен вывод, в котором я могу обрезать строки в groupby с идентификатором и условием «IF_car_history» == 1

tried_df =  df.groupby(['ID']).apply(lambda x: x.loc[:(x['IF_car_history'] == '1').idxmax(),:]).reset_index(drop = True)

Я хочу удалить строки в groupby после того, как я получу ['IF_car_history'] == '1'

ожидаемый результат:

expected output

Спасибо

1 Ответ

2 голосов
/ 08 мая 2020

Сначала сравните значения для маски m по Series.eq, а затем используйте GroupBy.cumsum, а для значений до 1 сравните 0, последний фильтр boolean indexing, но поскольку идентификатор необходимо удалить после последнего 1, используются замененные значения путем нарезки с помощью [::-1].

m = df['IF_car_history'].eq(1).iloc[::-1]
df1 = df[m.groupby(df['ID']).cumsum().ne(0).iloc[::-1]]
print (df1)
   ID  IF_car  IF_car_history  observation
2   2       0               0            0
3   2       1               1            1
5   3       0               0            0
6   3       0               0            0
7   3       1               1            2
8   3       0               0            0
9   3       1               1            3
...