【问题标题】:Apply "assertTrue" unit testing to pandas DataFrame?对 pandas DataFrame 应用“assertTrue”单元测试?
【发布时间】:2018-04-11 16:43:51
【问题描述】:

使用python的单元测试,如何检查pandas DataFrame df的列名与列表的列名是否一致?

import unittest

column_names_list = ["col1","col2","col3"]

assertTrue(df.columns in column_names_list)

例如,我应该为这个 df 得到 False:

col1   col2   col3   col4
aasa   4546   5643   shsh
...

【问题讨论】:

  • sorted(list(set(df.columns) & set(column_names_list)))==column_names_list ?

标签: python pandas unit-testing python-unittest


【解决方案1】:

使用set 可以找到两个列表之间的区别,assert 是 0

In [40]: assert len(set(df.columns) - set(['A', 'B', 'C'])) == 0

In [41]: assert len(set(df.columns) - set(['A', 'B', 'D'])) == 0
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
----> 1 assert len(set(df.columns) - set(['A', 'B', 'D'])) == 0

【讨论】:

  • 它会检查名称吗?没有唯一的列数?
  • 我在assert 旁边看到IndentationError: unexpected indent。我使用 Python 2.7。
  • 我也是,你一定是在引入垃圾字符或意外的空格/制表符。至于set,请阅读更多相关信息here。通过使用set,我们可以编写一个单元测试来断言列列表中没有一个不在另一个列中的元素。顺序无关紧要。列表不可散列,因此您将无法使用示例中的 in 关键字。
  • 注意:如果缺少其中一列,这不会引发 AssertionError。它仅在 DataFrame 中有其他非预期列时触发。例如{'A', 'B'} - {'A', 'B', 'C'} == {}
  • @de1 非常正确。使用set.difference() 可能会更好:assert len(set(df.columns).difference(set(['A', 'B', 'C', 'D']))) == 0
【解决方案2】:

您还可以使用集合相等。这样,断言错误可能会更有帮助(使用花括号表示集合):

匹配

df = pd.DataFrame([], columns=['col1', 'col2', 'col3'])
assert set(df.columns) == {'col1', 'col2', 'col3'}

不匹配

df = pd.DataFrame([], columns=['col1', 'col2'])
assert set(df.columns) == {'col1', 'col2', 'col3'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2014-05-24
    • 2014-06-03
    相关资源
    最近更新 更多