Итак, мой вопрос заключается в том, как получить значения «точности» столбца в +-1 друг от друга по отношению к столбцу «vin». если мы получим значение +-1, то должно быть минимум 2 значения конкретного «vin», а если оно меньше 2 значений, то оно будет ложным.
Ниже мой Dataframe:
импортировать панд как pd
df = pd.DataFrame({'vin':['aaa','aaa','aaa','aaa','bbb','bbb','bbb','bbb','ccc','ccc','ccc','ddd'],
'accuracy':[1,2,3,9,22,23,211,212,34,39,40,55]})
df
Мой ожидаемый результат будет похож на столбец «Результат».
df = pd.DataFrame({'vin':['aaa','aaa','aaa','aaa','bbb','bbb','bbb','bbb','ccc','ccc','ccc','ddd'],
'value':[1,2,3,9,22,23,211,212,34,39,40,55],'Result':['pass','pass','pass','fail','pass','pass','pass','pass','fail','pass','pass','fail']})
df
выход:
vin value Result
0 aaa 1 pass
1 aaa 2 pass
2 aaa 3 pass
3 aaa 9 fail
4 bbb 22 pass
5 bbb 23 pass
6 bbb 211 pass
7 bbb 212 pass
8 ccc 34 fail
9 ccc 39 pass
10 ccc 40 pass
11 ddd 55 fail
Предполагая, что данные отсортированы, вы можете вычислить разницу для каждой группы, проверить, что разница ≤ 1, а затем использовать эту маску и ее сдвиг для передачи в numpy.where
:
# if not sorted
# df = df.sort_values(by=['vin', 'accuracy'])
mask = df.groupby('vin')['accuracy'].diff().le(1)
df['Result'] = np.where(mask|mask.groupby(df['vin']).shift(-1), 'pass', 'fail')
выход:
vin accuracy Result
0 aaa 1 pass
1 aaa 2 pass
2 aaa 3 pass
3 aaa 9 fail
4 bbb 22 pass
5 bbb 23 pass
6 bbb 211 pass
7 bbb 212 pass
8 ccc 34 fail
9 ccc 39 pass
10 ccc 40 pass
11 ddd 55 fail