【问题标题】:How can I assert a cell value in Pandas Dataframe如何在 Pandas Dataframe 中断言单元格值
【发布时间】:2019-01-10 21:03:04
【问题描述】:

我正在编写 pytest 单元测试用例,其中调用返回一个 Pandas 数据框,我想在其中声明一个特定的单元格值。我试过这个,但把我扔了E ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

assert result_df.loc[result_df['col_A'].str.contains('A_val') and result_df['col_B'].str.contains('2018-05-13'), 'col_C'].item() == 'Q3'

这是我的示例数据:

    id   col_A      col_B  
0  RK7   A_val    2018-05-13                  
1  RK7   A_val    2018-09-02                   
0  BM    A1_val   2018-05-05                    
1  BM    A1_val   2018-05-05                      

          col_C  
0         Q3  
1         Q4  
0         Q1 
1         Q2 

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    在pandas掩码操作中不能使用and关键字,需要像这样使用位运算符&

    assert any(result_df.loc[result_df['colA'].str.contains('A_val') & result_df['colB'].str.contains('B_val')]['colC'] == 'C_val')
    

    【讨论】:

    • 这给了我E ValueError: can only convert an array of size 1 to a Python scalar
    • @Atihska 这意味着您的 df 中有不止一行与标准匹配。试试我更新的答案
    • 请检查我对我拥有的示例数据框的编辑。我得到空结果,所以这意味着我可能没有检查需要比较值的方式,因为我的数据框不为空。
    • 一个断言如果通过就会返回None。 “我得到空结果”是什么意思?
    • 这导致我空了:result_df.loc[result_df['colA'].str.contains('A_val') & result_df['colB'].str.contains('2018-05-13')]['col_C']
    【解决方案2】:

    找到它,我需要使用strftime 而不仅仅是str 转换日期时间序列。 这是正确的:

    check1 = result_df['col_A'].str.contains('A_val')
    check2 = result_df['col_B'].apply(lambda x: x.strftime('%Y-%m-%d')).str.contains('2018-05-13')
    assert result_df.loc[check1 & check2]['col_C'].item() == '2018-Q3-COST'
    

    感谢@wpercy 的所有帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 2020-06-17
      • 2016-12-26
      • 2016-01-06
      • 2014-04-24
      • 1970-01-01
      • 2015-12-08
      • 2021-03-22
      • 2017-06-10
      相关资源
      最近更新 更多