我有一个有2列(ID,内容)的数据帧,我以pickle格式保存.例如,我有10行(即0到9 ID).我试图通过从pickle file without loading the entire file传递ID(有效ID介于0-9之间)来加载单行.

import pandas as pd
import pickle

id = 2
path = "contents.pickle"

# dummy data
df = pd.DataFrame({
    "ID": [0,1,2,3,4,5,6,7,8,9],
    "Contents": [0,1,2,3,4,5,6,7,8,9]
})

print(f"{df=}")

df.to_pickle(path=path)

df = pd.read_pickle(filepath_or_buffer=path)

with open(path, "rb") as handle:
    df = pickle.load(handle)

以上两者都是一次性读取所有数据.我没有得到我应该通过ID来加载那一行的位置.如果dataframe不可能,我try 了简单的list,其中包含使用引用here保存在PICLE文件中的数据,但失败了.

data = [0,1,2,3,4,5,6,7,8,9]

with open(path, "wb") as handle:
    pickle.dump(data, handle)

file = open(file=path)

file.seek(id)

row = pickle.load(file)

print(f"{row=}")

推荐答案

不幸的是,我认为pickle不是正确的工具来做到这一点(但也许我错了).try 面向列的数据文件格式,如parquetpd.read_parquet:

df.to_parquet('results.parquet')

row = pd.read_parquet('results.parquet', filters=[('ID', '=', 9)])

输出:

>>> row
   ID  Contents
0   9         9

Update

pyarrowParquetDataset

import pyarrow.parquet as pq

ds = pq.ParquetDataset('results.parquet', filters=[('ID', '=', 9)])

输出:

>>> ds.read()  # read to get the row without load the entire file
pyarrow.Table
ID: int64
Contents: int64
----
ID: [[9]]
Contents: [[9]]

Python相关问答推荐

Locust请求中的Python和参数

比较两个二元组列表,NP.isin

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

时间序列分解

如何让剧作家等待Python中出现特定cookie(然后返回它)?

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

如何记录脚本输出

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

如何根据一列的值有条件地 Select 前N组?

字符串合并语法在哪里记录

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

matplotlib图中的复杂箭头形状

在Python中使用yaml渲染(多行字符串)

干燥化与列姆化的比较

无法在Spyder上的Pandas中将本地CSV转换为数据帧

如何反转一个框架中列的值?

pytest、xdist和共享生成的文件依赖项

如何将验证器应用于PYDANC2中的EACHY_ITEM?

解析CSV文件以将详细信息添加到XML文件

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?