比较值会产生不同的结果

时间:2015-04-20 13:04:24

标签: python postgresql pandas

我有一个脚本,可以将数据从csv读入pd数据帧。然后迭代每一行并将行作为pd系列传递给另一个模块。在这里,评估其中一列以查看它是否大于另一个pd系列中包含的值,例如:

df_1:

col_A, col_B, col_C
234.0, 563.2, 565.5
565.7, 324.3, 5676.4

df_2:

col_X, col_Y, col_Z
124.1, 763.5, 562.1

在上面的例子中,数据帧的第一行被选中并发送给一个函数,该函数检查df_1 ['Col_A'](即:234.0)是否大于df_2 ['col_X'](即:124.1) )。这一切都很完美。

我的问题是,我已经将脚本更改为从PostgreSQL数据库而不是csv文件中读取原始数据帧。其他一切都保持不变。比较似乎什么都不做,....它没有评估为真或假,它只是完全跳过评估。

比较从csv读入时正确工作的两个值(每个包含在pd系列中)的原始代码是:

if df_1['col_A'] > df_2['col_X']:
    #do something

我从csv和postgresql读入时都检查了两个值的类型。它正在比较:

<class 'float'> and <class 'numpy.float64'>

存储在数据库中的值是numeric(10,2)类型。

我试过以下无济于事:

if df_1.loc['col_A'] > df_2.loc['col_X']
and
if Decimal(df_1.loc['col_A']) > Decimal(df_2.loc['col_X'])
and
if abs(df_1.loc['col_A']) > abs(df_2.loc['col_X'])

我完全难倒,因为唯一改变的是从数据库而不是csv获取数据。生成的数据类型仍然相同,即:float与numpy.float64

进行比较

2 个答案:

答案 0 :(得分:1)

它在我的机器上工作正常。这段代码:

import numpy as np

df_1 = {'col_A': 234.0}
df_2 = {'col_X': np.float64(124.1)}

print(type(df_1['col_A']), type(df_2['col_X']))

if df_1['col_A'] > df_2['col_X']:
    #do something
    print(df_1['col_A'], 'is greater than', df_2['col_X'])

打印出来:

<class 'float'> <class 'numpy.float64'>
234.0 is greater than 124.1

您使用的是什么版本的Python和numpy?

答案 1 :(得分:1)

Numpy因其C根而拥有比纯Python更复杂的类型系统。当你的(可能是非numpy)代码读取&#39; float&#39;变量,numpy类型可能只是说&#34;嘿,我不知道没有&#39;浮动&#39;,迷路&#34;。正如@ tommy-carstensen指出的那样,他们是否确实这样做取决于python和numpy的版本。

在对它们执行比较或算术运算之前,您需要确保所有变量属于同一类型。请参阅Converting numpy dtypes to native python types进行讨论。