You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:42:49