使用REFPROP TPFLSHdll处理DataFrame列报错,求无循环解决方案
问题描述
我有一个DataFrame对象data,其中包含data['T']和data['P']两列。调用TPFLSHdll函数时出现如下错误:
TypeError: cannot convert the series to <class 'float'>
相关代码:
import os from ctREFPROP.ctREFPROP import REFPROPFunctionLibrary # 连接Python与REFPROP库(自动读取路径) RP = REFPROPFunctionLibrary(os.environ['RPPREFIX']) RP.SETPATHdll(os.environ['RPPREFIX']) RP.SETUPdll(1, 'WATER.FLD', "HMX.BNC","DEF") D, Dl, Dv, x, y, q, e, h, s, Cv, Cp, w, ierr, herr = RP.TPFLSHdll(data['T'], data['P'], [1])
之前遇到类似问题时,通过添加.values解决:
import os from ctREFPROP.ctREFPROP import REFPROPFunctionLibrary # 连接Python与REFPROP库(自动读取路径) RP = REFPROPFunctionLibrary(os.environ['RPPREFIX']) RP.SETPATHdll(os.environ['RPPREFIX']) RP.SETUPdll(1, 'WATER.FLD', "HMX.BNC","DEF") D, Dl, Dv, x, y, q, e, h, s, Cv, Cp, w, ierr, herr = RP.TPFLSHdll(data['T'].values, data['P'].values, [1])
但现在添加.values后出现新错误:
TypeError: only size-1 arrays can be converted to Python scalars
请问有没有无需使用FOR循环的解决办法?
解决方法
错误原因
当传入数组形式的温度(T)和压力(P)时,组分参数需要与T/P数组长度一致,而不是单元素列表[1]——函数会尝试将单元素列表与多维数组进行匹配,导致类型不兼容错误。
代码实现
只需将组分参数修改为与T/P同长度的数组即可,无需循环:
import os import numpy as np from ctREFPROP.ctREFPROP import REFPROPFunctionLibrary # 连接Python与REFPROP库(自动读取路径) RP = REFPROPFunctionLibrary(os.environ['RPPREFIX']) RP.SETPATHdll(os.environ['RPPREFIX']) RP.SETUPdll(1, 'WATER.FLD', "HMX.BNC","DEF") # 生成与T/P同长度的组分数组(单组分场景下所有元素为1) z = np.ones_like(data['T'].values) # 调用TPFLSHdll进行批量计算 D, Dl, Dv, x, y, q, e, h, s, Cv, Cp, w, ierr, herr = RP.TPFLSHdll(data['T'].values, data['P'].values, z)
额外说明
如果需要更简洁的写法,也可以直接用np.ones(len(data['T']))生成组分数组,效果一致。这种方式利用了REFPROP底层函数的批量计算能力,完全不需要循环遍历每一行数据。
内容的提问来源于stack exchange,提问作者niccolo_guazz
相关产品推荐
相关产品推荐

