Поэтому у меня есть pytest, проверяющий результаты запроса, который возвращает pandas dataframe.
Я хочу утверждать, что конкретный столбец col
имеет все значения, которые являются подстрокой заданного ввода.
Так что это ниже дает мне строки (dataframe), которые имеют этот столбец col
значение, содержащее некоторую входную часть. Как я могу утверждать, что это правда?
assert result_df[result_df['col'].astype(str).str.contains(category)].bool == True
не работает
Найди его. assert result_df[result_df['col'].astype(str).str.contains(category)].bool
works
или assert result_df['col'].astype(str).str.contains(category).all
(Спасибо @jezrael за то, что вы предлагаете все)
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
print ((result_df['col'].astype(str).str.contains(category).bool))
возвращается <bound method NDFrame.bool
а затем всегда True
Попробуй это:
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, а не всеми значениями в нем.
Я считаю, что вам нужен 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
KeyError: u'the label [bool] is not in the [columns]'
.
all
будет без скобок, так как тогда только это работает.