是否可以向pandas DataFrame添加一些元信息/元数据?
例如,用于测量数据的仪器名称,负责的仪器等.
一种解决方法是创建一个包含该信息的列,但在每一行中存储单条信息似乎很浪费!
用例
我正在使用 Apache Parquet 文件作为我在 Python 中使用 GeoPandas 处理大型空间数据的快速 IO 格式。我将要素几何存储为 WKB,并希望将坐标参考系统 (CRS) 记录为与 WKB 数据关联的元数据。
代码问题
我正在尝试将任意元数据分配给一个pyarrow.Field
对象。
我试过的
假设table
是pyarrow.Table
从df
, a的实例化pandas.DataFrame
:
df = pd.DataFrame({
'foo' : [1, 3, 2],
'bar' : [6, 4, 5]
})
table = pa.Table.from_pandas(df)
Run Code Online (Sandbox Code Playgroud)
根据pyarrow
文档,列元数据包含在field
属于schema
( source ) 的 a 中,并且可选的元数据可以添加到field
( source ) 中。
如果我尝试为该metadata
属性赋值,则会引发错误:
>>> table.schema.field_by_name('foo').metadata = {'crs' : '4283'}
AttributeError: attribute 'metadata' of 'pyarrow.lib.Field' objects …
Run Code Online (Sandbox Code Playgroud) 如何使用ParquetDataset
pyarrow 将自定义元数据存储?
例如,如果我使用 Dask 创建 Parquet 数据集
import dask
dask.datasets.timeseries().to_parquet('temp.parq')
Run Code Online (Sandbox Code Playgroud)
然后我可以使用 pyarrow 阅读它
import pyarrow.parquet as pq
dataset = pq.ParquetDataset('temp.parq')
Run Code Online (Sandbox Code Playgroud)
但是,我用于为单个 parquet 文件编写元数据的相同方法(在如何使用 pyarrow 编写 Parquet 元数据?中概述)不适用于 a ParquetDataset
,因为没有replace_schema_metadata
函数或类似的函数。
我想我可能想编写一个自定义_custom_metadata
文件,因为我想存储的元数据与整个数据集有关。我想这个过程会类似于:
meta = pq.read_metadata('temp.parq/_common_metadata')
custom_metadata = { b'type': b'mydataset' }
merged_metadata = { **custom_metadata, **meta.metadata }
# TODO: Construct FileMetaData object with merged_metadata
new_meta.write_metadata_file('temp.parq/_common_metadata')
Run Code Online (Sandbox Code Playgroud) 当我在 R 和 Python 中保存 parquet 文件(使用 pyarrow)时,我得到一个保存在元数据中的箭头模式字符串。
\n\n如何读取元数据?是Flatbuffer编码的数据吗?模式的定义在哪里?它没有列在箭头文档网站上。
\n\n元数据是一个键值对,如下所示
\n\nkey: "ARROW:schema"\n\nvalue: "/////5AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABAwAEAAAAyP///wQAAAABAAAAFAAAABAAGAAIAAYABwAMABAAFAAQAAAAAAABBUAAAAA4AAAAEAAAACgAAAAIAAgAAAAEAAgAAAAMAAAACAAMAAgABwA\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n用 R 写的结果
\n\nkey: "ARROW:schema"\n\nvalue: "/////5AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABAwAEAAAAyP///wQAAAABAAAAFAAAABAAGAAIAAYABwAMABAAFAAQAAAAAAABBUAAAAA4AAAAEAAAACgAAAAIAAgAAAAEAAgAAAAMAAAACAAMAAgABwA\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n