如何将 C 结构(或 Numpy 记录数组)读入 Polars Dataframe?
How to read a C struct (or Numpy record array) into a Polars Dataframe?
我有一个二进制文件,其中包含来自 C 结构的记录。我想将该文件读入 Polars Dataframe。
我可以按照下面的方式完成,但我想知道是否有更直接的路径?
我目前的解决方案包括:
- 使用
np.fromfile()
将文件读入 Numpy 记录数组(见下文)
- 将其转换为 Pandas DataFrame
- 将其转换为 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')])
我有一个二进制文件,其中包含来自 C 结构的记录。我想将该文件读入 Polars Dataframe。
我可以按照下面的方式完成,但我想知道是否有更直接的路径?
我目前的解决方案包括:
- 使用
np.fromfile()
将文件读入 Numpy 记录数组(见下文)
- 将其转换为 Pandas DataFrame
- 将其转换为 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')])