#python #pandas
Вопрос:
У меня есть функция, которая предоставляет индекс строк, удовлетворяющих некоторому заданному условию (или ряду условий).
def some_function(df, a, b, c, d): return df.index[df["A"].eq(a) amp; df["B"].eq(b) amp; df["C"].eq(c) amp; df.eq(d)]
Теперь я хочу игнорировать определенные условия, если значение отсутствует.
df.index[df["A"].eq(a) amp; df["B"].eq(b) amp; df["C"].eq(c) amp; (df["D"] if D == None else df["D"].eq(d)]
Однако приведенное выше условие всегда возвращает пустой список. Похоже, что отсутствие оценки состояния df["D"]
влияет на конечный результат.
Можно ли условно оценить условие с помощью Pandas
(без написания двух отдельных запросов)? Если да, то как я могу это сделать?
Комментарии:
1. Написание выражения с
df.query()
помощью может дать больше гибкости.2. @sj95126 Я думаю, что это сработало бы с некоторой
f-strings
магией. Все еще хотелось бы, чтобы был прямой способ сделать это. Спасибо за предложение 🙂 1
Ответ №1:
Вы можете создать первую часть маски в переменной, а затем обновить маску с помощью простых if
инструкций:
def some_function(df, a, b, c, d): mask = df["A"].eq(a) amp; df["B"].eq(b) amp; df["C"].eq(c) if d != None: mask amp;= df["D"].eq(d) return df.index[mask]
Вы также можете использовать свою первоначальную попытку, только вместо df["D"] if ...
использования True if ...
:
def some_function(df, a, b, c, d): return df.index[df["A"].eq(a) amp; df["B"].eq(b) amp; df["C"].eq(c) amp; (True if d == None else df["D"].eq(d))] # ^^^^ Replaced df["D"] with True