Почему бы не сделать это?
def filt_spec(df, col, val, op):
import operator
ops = {'eq': operator.eq, 'neq': operator.ne, 'gt': operator.gt, 'ge': operator.ge, 'lt': operator.lt, 'le': operator.le}
return df[ops[op](df[col], val)]
pandas.DataFrame.filt_spec = filt_spec
Демонстрация:
df = pd.DataFrame({'a': [1,2,3,4,5], 'b':[5,4,3,2,1]})
df.filt_spec('a', 2, 'ge')
Результат:
a b
1 2 4
2 3 3
3 4 2
4 5 1
Вы можете видеть, что столбец 'a' был отфильтрован, где a> = 2.
Это немного быстрее (время ввода, а не производительность), чем цепочка операторов. Конечно, вы могли бы поставить импорт в верхнюю часть файла.
В качестве обходного пути (я все еще не уверен, что это лучший способ сделать это, потому что в примерах кода это не нужно ...), я добавил ручное обнаружение изменений в конце моей функции валидатора:
private _studentEmailValidator(): AsyncValidatorFn {
return (control: FormGroup): Observable<{ [key: string]: any } | null> => {
const email = control.value;
return this._adminFacade.checkStudentWithEmailExists(email).pipe(
take(1),
map(exists => exists ? {'emailAlreadyUserByStudent': {value: email}} : null),
catchError(() => null),
tap(() => setTimeout(() => this._checkDetectorRef.detectChanges(), 0))
);
}
};
Попробуйте сделать это:
import { ChangeDetectorRef } from '@angular/core';
constructor(
changeDetectorRef: ChangeDetectorRef
) {
//call this when you receive the backend response
changeDetectorRef.markForCheck();
}