我有一个脚本,可以将数据从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
进行比较答案 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进行讨论。