В моем коде у меня есть несколько переменных, которые могут содержать Pandas DataFrame или вообще ничего. Скажем, я хочу протестировать и посмотреть, создан ли какой-то определенный DataFrame или нет. Моя первая мысль заключалась в том, чтобы проверить это следующим образом:
if df1:
# do something
Однако этот код не работает таким образом:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Справедливо. В идеале, я хотел бы иметь тест присутствия, который работает либо для DataFrame, либо для Python None.
Вот один из способов:
if not isinstance(df1, type(None)):
# do something
Тем не менее, тестирование для типа происходит очень медленно.
t = timeit.Timer('if None: pass')
t.timeit()
# approximately 0.04
t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')
t.timeit()
# approximately 0.4
Уч. Наряду с медленностью, тестирование для NoneType также не очень гибкое.
Другим решением было бы инициализировать df1
как пустой DataFrame, так что тип был бы одинаковым как в случае с нулевым, так и непустым случаем. Я мог бы просто проверить с помощью len()
или any()
, или что-то в этом роде. Однако создание пустой DataFrame кажется глупым и расточительным.
Другим решением было бы иметь переменную индикатора: df1_exists
, для которой установлено значение False до df1
. Затем вместо тестирования df1
я бы тестировал df1_exists
. Но это тоже не так элегантно.
Есть ли лучший, более питонический способ решения этой проблемы? Я что-то упускаю, или это просто неудобный побочный эффект от всех удивительных вещей о пандах?