Как утверждать, что кадр данных pandas, отфильтрованный по условию, является истинным

1

Поэтому у меня есть pytest, проверяющий результаты запроса, который возвращает pandas dataframe.

Я хочу утверждать, что конкретный столбец col имеет все значения, которые являются подстрокой заданного ввода.

Так что это ниже дает мне строки (dataframe), которые имеют этот столбец col значение, содержащее некоторую входную часть. Как я могу утверждать, что это правда?

assert result_df[result_df['col'].astype(str).str.contains(category)].bool == True 

не работает

  • 0
    Вы пытаетесь утверждать, что все значения в отфильтрованном фрейме данных равны True?
  • 0
    @Kapocsi Да, я пытаюсь, чтобы все было правдой
Теги:
pandas
pytest

3 ответа

0

Найди его. assert result_df[result_df['col'].astype(str).str.contains(category)].bool works

или assert result_df['col'].astype(str).str.contains(category).all (Спасибо @jezrael за то, что вы предлагаете все)

  • 0
    Проблема кода в том, что если проверка print ((result_df['col'].astype(str).str.contains(category).all)) возвращает bound method Series.all и при использовании assert он работает как print (bool(result_df['col'].astype(str).str.contains(category).all)) - всегда возвращает True
  • 0
    Также для print ((result_df['col'].astype(str).str.contains(category).bool)) возвращается <bound method NDFrame.bool а затем всегда True
0

Попробуй это:

assert result_df[result_df['col'].astype(str).str.contains(category)].bool.all(axis=None) == True

Дополнительную информацию см. В документах pandas: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.all.html.

Причина, по которой ваш код не работает, заключается в том, что вы пытаетесь проверить, является ли объект dataframe True, а не всеми значениями в нем.

0

Я считаю, что вам нужен Series.all для проверки, соответствуют ли все значения фильтрованных Series True s:

assert result_df['col'].astype(str).str.contains(category).all()

Образец:

result_df = pd.DataFrame({
         'col':list('aaabbb')
})

print (result_df)
  col
0   a
1   a
2   a
3   b
4   b
5   b

category = 'b'
assert result_df['col'].astype(str).str.contains(category).all()

AssertionError

Деталь:

print (result_df['col'].astype(str).str.contains(category))
0    False
1    False
2    False
3     True
4     True
5     True
Name: col, dtype: bool

print (result_df['col'].astype(str).str.contains(category).all())
False

category = 'a|b'
assert result_df['col'].astype(str).str.contains(category).all()

print (result_df['col'].astype(str).str.contains(category))

0    True
1    True
2    True
3    True
4    True
5    True
Name: col, dtype: bool

print (result_df['col'].astype(str).str.contains(category).all())
True
  • 0
    Используя ваш код, я получаю сообщение об ошибке KeyError: u'the label [bool] is not in the [columns]' .
  • 0
    Спасибо за Ваш ответ. Думаю all будет без скобок, так как тогда только это работает.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню