将 JMP 数据表作为 Pandas 数据框传递给 Python在 JMP 的早期版本(JMP 18 之前)中,当您将 JMP 数据表传递给 Python 时,默认情况下它是一个 Pandas 数据框(非常好)。不幸的是,该功能似乎已在 JMP 18 中被取消,在使用 PythonSend() 将数据表传递给 Python 后,您需要循环遍历每一列并转换为 Numpy 数组,如下所示:
df = pd.DataFrame()
for i in range( len(cols) ):
df[ cols[i].name ] = np.array( cols[i] )
对于大型数据表来说,这非常耗时。我收到了一位大量使用 JMP 和 Python 的客户 (NVIDIA) 的负面反馈。
有没有办法将数据表作为 Pandas 数据框传递给 Python,而无需进行这种转换?或者更好的是,我们可以恢复默认执行此操作的 PythonSend() 的 JMP 17 功能吗?
谢谢,
标记
回复:将 JMP 数据表作为 Pandas 数据框传递给 Python在 JMP 18 中,有以下方法
import pandas as pd
import jmp
# open the JMP data table
tablepath=<PATHNAME string="">dt=jmp.open(tablepath) # 您也可以使用 dt=jmp.current() 或 dt=jmp.table(<'tablename'>) # 定义函数将 JMP 表转换为 pandas 数据框 def jmpTableToDataFrame(dt) : # 直接从 JMP DataTable 创建 Pandas 数据框。 df = pd.DataFrame() for idx in range( len(dt) :(</img> print(dt[idx].name) if dt[idx].dtype == jmp.DataType.Numeric: # 使用 Python 的缓冲区协议直接创建数字列 col = np.array( dt[idx] ) df[ dt[idx].name ] = col.tolist() # 使其成为 pandas 的列表。 elif dt[idx].dtype == jmp.DataType.Character: # 通过迭代值创建列表 col = list() for i in range ( dt.nrows :(</img> col.append(dt[idx][i]) # 从列表构建字符列 df[ dt[idx].name ] = col else: print( dt[idx].dtype ) return df # 将 JMP 表转换为 pandas 数据框 df = jmpTableToDataFrame(dt); print(df)</PATHNAME>
回复:将 JMP 数据表作为 Pandas 数据框传递给 Python我只想指出,循环遍历列的速度比 JMP 17 的行为快几个数量级。这一切都发生在内存中。JMP 14-17 将 JMP 数据表作为临时 CSV 文件写入磁盘,然后从 pandas 中将文件读回为 CSV 文件。一位客户有一个 200M 的 .jmp 文件,在传输过程中膨胀到 3G CSV,耗时 15 分钟。旧方法还可能造成数据精度损失,因为它将二进制转换为文本,然后将文本转换回二进制。
如果您确实想使用旧方法,它包含在 SAMPLE_SCRIPTS/Python/dt2pandas.py 中,作为函数 to_pandas(dt)。接收 jmp.DataTable 对象并返回 pandas.DataFrame。
我们不会将 Python Send(dt) 默认为发送 pandas.DataFrame。jmp.DataTable 对象使 Python 代码能够从 Python 实时操作和处理 JMP 数据表,而 pandas 则不能。
这将是使用 JMP 14-17 的 Python 的用户需要适应的最大变化。但如果您想按照旧方式执行,最坏的情况是,在发送后的代码中需要添加 1 个额外的导入语句import dt2pandas和 pd = to_pandas(dt)。或者等效地将循环遍历列的代码包装在一个函数中,然后调用它来从 jmp.DataTable 对象在内存中创建 pandas 数据框。
回复:将 JMP 数据表作为 Pandas 数据框传递给 Python另请参阅我的博客文章。
https://community.jmp.com/t5/JMPer-Cable/New-in-JMP-18-Python-jmp-DataTable-and-pandas-DataFrame/ba-p/744680
回复:将 JMP 数据表作为 Pandas 数据框传递给 Python感谢 Paul 的精彩解释!我认为用户并没有注意到性能差异,而只是注意到了 PythonSend() 行为的差异。当这个话题出现时(肯定会出现),指出这一性能改进很重要,这样人们才能将其视为一项功能,而不是一个错误。我会与 Nvidia 分享您关于该主题的精彩博客文章。
回复:将 JMP 数据表作为 Pandas 数据框传递给 Python嗨萨姆/保罗,
您分享的这个函数是否被认为是将 JMP 数据表转换为 Pandas 数据框的最佳方法?对于任何 JMP/Python 用户来说,这都是普遍使用的方法。因此我认为它值得包含在 JMP Python 库中?