在评估包含多个DataFrame的元组对象时,非常令人费解的行为

时间:2015-01-26 10:31:28

标签: python if-statement pandas tuples conditional-statements

我有一些声明,我调用了一个我自己定义的函数:

sim_extracted_dfs = extract_dataframes(sim_queue_total_df_sim)
print (sim_extracted_dfs is tuple)

其中extract_dataframes()是一个接受一个大型DataFrame作为参数的函数,并处理该DataFrame以返回一个由4个较小的DataFrame组成的元组,因为从它返回自身的元组可以看出这一点:

return ( pd.concat(objs = df_list_first_param, ignore_index = True),
       pd.concat(objs = df_list_second_param, ignore_index = True),
       pd.concat(objs = df_list_third_param, ignore_index = True),
       pd.concat(objs = df_list_fourth_param, ignore_index = True) )

由于sim_extracted_dfs是一个元组对象,我稍后将在我的代码中使用它在一些for循环中,我将遍历此元组的每个项目(在本例中为DataFrame)。但是,我在尝试这样做时遇到了一些问题,我只是意识到,当我以非交互方式执行我的代码时,sim_extracted_dfs似乎并不被视为元组。使用以下调试语句:

print (sim_extracted_dfs is tuple)
print type(sim_extracted_dfs)

我在执行ipython data_analysis.py时在终端中得到这些非常令人费解和矛盾的相应输出,其中data_analysis是模块的名称:

False
<type 'tuple'>

我更进一步推出了IPython并导入了我的模块(我的模块的名称是data_analysis),这样我就可以交互式地进行调试了,这就是我得到的:

In [108]: type(data_analysis.sim_extracted_dfs)
Out[108]: tuple

In [109]: data_analysis.sim_extracted_dfs is tuple
Out[109]: True

In [110]: print (data_analysis.sim_extracted_dfs is tuple)
True

In [111]: print data_analysis.sim_extracted_dfs is tuple
True

In [112]: 

这真让我疯了。这是一个错误还是什么?为什么现在sim_extracted_dfs is tupleTrue?我几乎整天都在这一个问题上陷入困境,我无法继续使用我的模块的其余部分,因为其他一切都依赖于这个条件来正确评估我的DataFrame元组。我真的很感激你的帮助。

非常感谢。

1 个答案:

答案 0 :(得分:2)

请勿使用is运算符来比较类型。来自docs

  

运算符isis not测试对象标识:当且仅当x is yx是同一个对象时,y才为真。

相反,请尝试使用isinstance

isinstance(sim_extracted_dfs, tuple)