pyarrow 数据集 to_table 按索引过滤

时间:2021-07-29 07:20:21

标签: python indexing dataset pyarrow

我有一个 pyarrow 数据集,我正在尝试按索引过滤。 pyarrow 文档按列或“字段”显示过滤器,但不清楚如何为索引过滤执行此操作。 我通过打印 dataset.to_table() 的结果检查了我的表,发现索引列被标记为 __index_level_0__: string。 然后我设法通过使用该值作为我的字段来过滤索引,即: dataset.to_table(filter=ds.field("__index_level_0__") == 'index_to_search_for')

有没有更好的方法来按索引过滤?

1 个答案:

答案 0 :(得分:1)

<块引用>

有没有更好的方法来按索引过滤?

目前,没有更好的方法。有一些细节可以帮助您。

首先,您需要确保索引实际上是一列。如果可能,Arrow 将存储一个简单的范围索引作为元数据而不是实际的列。有关此过程的更多详细信息,您可以阅读 here。为了确保在从 Pandas 转换为 Arrow 时将索引存储为通过 preserve_index=True 的列(您没有描述您是如何执行此操作的,因此我不确定您会将其传递给哪个确切的函数)。

其次,您需要获取索引列名称。如果您始终只有一个列索引并且它从来没有名称,那么猜测它是 __index_level_0__ 可能会起作用。或者,有两种方法可以更灵活地处理传入数据。

您可以为索引指定名称:

df = pd.DataFrame(data={'x': [1, 2, 3]})
df.index.name = 'idx'
pa.Table.from_pandas(df, preserve_index=True).field('idx')
# pyarrow.Field<idx: int64>

或者你可以从 Arrow 表的元数据中提取索引列:

table = pa.Table.from_pandas(df, preserve_index=True)
pandas_meta_str = table.schema.metadata[b'pandas']
pandas_meta = json.loads(pandas_meta_str)
pandas_meta['index_columns']
# ['idx']
table.field(pandas_meta['index_columns'][0])
# pyarrow.Field<idx: int64>