如何从 pickle 二进制文件读取并使用 DataFrame?
数据阿明
结论
open() 返回文件对象,不能直接用列名从中取数据。先用 pickle.load() 从文件中恢复 DataFrame,再从中选取列。读取文件时使用 rb 模式。
保存数据时调用了 pkl.dump(df, f),读取时就对同一个文件调用 pkl.load(f):
import pickle as pkl
import pandas as pd
with open(bin_path, "rb") as f:
df = pkl.load(f)
X = df[col_names[:-1]]
y = df[col_names[-1]]
这里,X 是包含除最后一列以外各列的 DataFrame,y 是最后一列的 Series。原代码中的 f[col_names[:-1]] 会报错,因为 f 是文件对象,不是加载后的数据表。
保存和读取示例
以下代码展示了数据的保存和读取过程。dataset_loc 应指向 pd.read_csv() 可以读取的数据文件。
import pickle as pkl
import pandas as pd
def create_dataset(path):
df = pd.read_csv(path)
saved_path = "some_path"
with open(saved_path, "wb") as f:
pkl.dump(df, f)
return saved_path, df.columns.tolist()
def main():
bin_path, col_names = create_dataset(dataset_loc)
with open(bin_path, "rb") as f:
df = pkl.load(f)
X = df[col_names[:-1]]
y = df[col_names[-1]]
如果在另一个运行过程或脚本中读取数据,需要先取得 bin_path 和列名列表。已知列名时,也可以在加载后直接选列,例如 X = df[["feature_a", "feature_b"]]、y = df["target"]。示例中的列名应替换为数据里的实际列名。
注意事项
wb用于写入二进制文件,rb用于读取。读取时不需要+,通常无需使用rb+。- 只有用 pickle 保存的内容,才能用
pickle.load()读取。 - 不要对来源不可信的 pickle 文件调用
pickle.load(),因为反序列化可能执行文件中包含的代码。
备注:内容仅供参考。
