如何从一个numpy结构化数组创建一个有用的Polars数据框架?

jfgube3f  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(203)

我正在将一个应用程序从Pandas转换为Polars,以寻求更好的可扩展性和性能。我的应用程序从hdf 5复合数据集(使用h5 py)读取数据到一个numpy结构化数组中,从中我直接创建了Pandas Dataframe ,如下所示:

# dset is the hdf5 compound Dataset
np_struct_array = np.empty(dset.shape, dset.dtype)
dset.read_direct(np_struct_array)
df=pd.DataFrame(np_struct_array, dset.dtype)

numpy结构化数组的dtype取决于所读取的h5数据集,但典型示例如下所示

[('SID', '<i8'), ('G', '<i8'), ('C', '<i8'), ('D', '<f8'), ('DOMAIN_ID', '<i8')]

这非常快,而且dataframe直接使用numpy结构化数组中的列名和类型
当我切换到Polars并使用相同的方法时,生成的Polars Dataframe 是一个类型为object的单列 Dataframe ,这不是我所需要的-例如,从上面的numpy结构化数组生成的模式是{'column_0': Object}
我可以执行以下操作并获得所需的dataframe,但性能很糟糕-比Pandas慢10倍

df=pd.DataFrame(
    {
      field_name: np_struct_array[field_name] for field_name in np_struct_array.dtype.fields
    }
)

所以我的问题是什么是最快/最有效的方法来获得hdf 5复合数据集到Polars Dataframe ?有没有更好的方法来使用numpy结构化数组,例如Polars?我可以继续将数据读入Pandas Dataframe ,然后从中创建Polars Dataframe ,但我认为这将创建一个副本,我宁愿避免,因为数据可能很大。
任何建议将不胜感激。
道格

n6lpvg4x

n6lpvg4x1#

仅供参考:我昨天添加了native support,用于从numpy结构化/记录数组初始化polars DataFrame,它将在即将发布的0.17.12版本中提供。(原生支持从polars * 导出 * 到numpy结构化/记录数组也即将合并)。

相关问题