如何将 C 结构(或 Numpy 记录数组)读入 Polars Dataframe?

How to read a C struct (or Numpy record array) into a Polars Dataframe?

我有一个二进制文件,其中包含来自 C 结构的记录。我想将该文件读入 Polars Dataframe。

我可以按照下面的方式完成,但我想知道是否有更直接的路径?

我目前的解决方案包括:

# Data read in from file using np.fromfile()
data = np.array([(1, 2002, 2, 13, 0.3),
                 (2, 2005, 1, -10, 1.5),
                 (3, 2004, 2, 54, -0.12)],
    dtype=[("id", "<i4"),("yr", "<u2"),("sex", "<u2"),("val1", "<i2"),("val2", "<f4")]
)
df = pl.from_pandas(pd.DataFrame(data))
df
 id   yr    sex val1    val2
i32  u16    u16  i16     f32
  1 2002      2   13     0.3
  2 2005      1  -10     1.5
  3 2004      2   54   -0.12

我尝试使用 pl.DataFrame(data)pl.from_records(data)data 从 numpy 直接读入 Polars,但在这两种情况下我都得到一个类型为“object”的单列数据框,它我不知道如何分成单独的列或转换为结构。

data = np.array([(1, 2002, 2, 13, 0.3),
                (2, 2005, 1, -10, 1.5),
                (3, 2004, 2, 54, -0.12)],
    dtype=[("id", "<i4"),("yr", "<u2"),("sex", "<u2"),("val1", "<i2"),("val2", "<f4")]
)

pl.DataFrame(
    {
        field_name: data[field_name]
        for field_name in data.dtype.fields
    }
)
┌─────┬──────┬─────┬──────┬───────┐
│ id  ┆ yr   ┆ sex ┆ val1 ┆ val2  │
│ --- ┆ ---  ┆ --- ┆ ---  ┆ ---   │
│ i32 ┆ u16  ┆ u16 ┆ i16  ┆ f32   │
╞═════╪══════╪═════╪══════╪═══════╡
│ 1   ┆ 2002 ┆ 2   ┆ 13   ┆ 0.3   │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ 2   ┆ 2005 ┆ 1   ┆ -10  ┆ 1.5   │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ 3   ┆ 2004 ┆ 2   ┆ 54   ┆ -0.12 │
└─────┴──────┴─────┴──────┴───────┘

要转换回 numpy 结构数组,请为每个字段分配一个 numpy 数组:

# Create numpy struct array of the correct size.
numpy_struct_array = np.empty(df.height, data.dtype)

# Fill in the correct values.
for field, col in zip(data.dtype.fields, df.columns):
    numpy_struct_array[field] = df.get_column(col).to_numpy()

numpy_struct_array
array([(1, 2002, 2,  13,  0.3 ), (2, 2005, 1, -10,  1.5 ),
       (3, 2004, 2,  54, -0.12)],
      dtype=[('id', '<i4'), ('yr', '<u2'), ('sex', '<u2'), ('val1', '<i2'), ('val2', '<f4')])