Pandas — значения масок по умолчанию при условной индексации

#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