Polars转Pandas后自定义Python对象变为bytes:如何恢复或避免转换?
解决Polars转Pandas时自定义对象变为bytes的问题
一、阻止自定义对象转为bytes(推荐)
Polars默认会对Python自定义对象进行pickle序列化,导致转Pandas时变成bytes。要避免这种情况,只需在创建Polars DataFrame时将自定义对象列的类型指定为pl.Object:
import pandas as pd import polars as pl class MyClass: def __init__(self, x, y): self.x = x self.y = y # 创建DataFrame时显式指定自定义列为Object类型 df = pl.DataFrame( {"my_class": [MyClass(1,2), MyClass(3,4)]}, dtype={"my_class": pl.Object} ) # 转换为Pandas DataFrame,自定义对象会被保留 pd_df = df.to_pandas() print(pd_df) # 验证对象类型 print(type(pd_df["my_class"].iloc[0])) # 输出 <class '__main__.MyClass'>
二、从bytes恢复原始自定义对象
如果已经得到了包含bytes的Pandas DataFrame,可以通过pickle.loads()反序列化恢复原始对象(Polars默认用pickle序列化自定义对象):
import pickle import pandas as pd import polars as pl class MyClass: def __init__(self, x, y): self.x = x self.y = y # 模拟已转换为bytes的场景 df = pl.DataFrame({"my_class": [MyClass(1,2), MyClass(3,4)]}) pd_df_with_bytes = df.to_pandas() # 反序列化每个元素恢复对象 pd_df_with_bytes["my_class"] = pd_df_with_bytes["my_class"].apply(pickle.loads) # 验证结果 print(type(pd_df_with_bytes["my_class"].iloc[0])) # 输出 <class '__main__.MyClass'> print(pd_df_with_bytes["my_class"].iloc[0].x) # 输出 1
注意事项
- 反序列化时,自定义类(如
MyClass)必须在当前运行环境中存在定义,否则会抛出AttributeError。 - pickle存在安全风险,不要反序列化来自不可信来源的bytes数据。
内容的提问来源于stack exchange,提问作者AnAlias
相关产品推荐
相关产品推荐

