Python 我可以用一个字典列存储一个拼花地板文件,该列的值中有混合类型吗?

Python 我可以用一个字典列存储一个拼花地板文件,该列的值中有混合类型吗?,python,pandas,dataframe,parquet,pyarrow,Python,Pandas,Dataframe,Parquet,Pyarrow,我试图将Python数据帧存储为拼花文件,但遇到了一些问题。我的词典的其中一列包含以下词典: 将熊猫作为熊猫导入 df=pd.DataFrame({ “可乐”:[1,2,3], “ColB”:[“X”、“Y”、“Z”], “ColC”:[ {“字段”:“值”}, {“字段”:“值2”}, {“字段”:“值3”} ] }) df.to_拼花地板(“测试拼花地板”) 现在,这很好,问题是当字典的一个嵌套值的类型与其他值不同时。例如: 将熊猫作为熊猫导入 df=pd.DataFrame({ “可乐”

我试图将Python数据帧存储为拼花文件,但遇到了一些问题。我的词典的其中一列包含以下词典:

将熊猫作为熊猫导入
df=pd.DataFrame({
“可乐”:[1,2,3],
“ColB”:[“X”、“Y”、“Z”],
“ColC”:[
{“字段”:“值”},
{“字段”:“值2”},
{“字段”:“值3”}
]
})
df.to_拼花地板(“测试拼花地板”)
现在,这很好,问题是当字典的一个嵌套值的类型与其他值不同时。例如:

将熊猫作为熊猫导入
df=pd.DataFrame({
“可乐”:[1,2,3],
“ColB”:[“X”、“Y”、“Z”],
“ColC”:[
{“字段”:“值”},
{“字段”:“值2”},
{“字段”:[“值3”]}
]
})
df.to_拼花地板(“测试拼花地板”)
这会引发以下错误:

ArrowInvalid:(“不能混合列表和非列表,非空值”,“具有类型对象的列ColC的转换失败”)

注意,对于DF的最后一行,
ColC
字典的
字段
属性是一个列表而不是字符串


是否有任何解决方法可以将此DF存储为拼花地板文件?

ColC
是一种UDT(用户定义类型),其中一个字段名为
字段
,类型为
字符串并集,字符串列表

理论上,arrow支持它,但在实践中,它很难弄清楚
ColC
的类型。即使您显式地提供了数据帧的模式,它也不会起作用,因为这种类型的转换(将组合从熊猫转换为箭头/拼花地板)还不受支持

union_type = pa.union(
    [pa.field("0",pa.string()), pa.field("1", pa.list_(pa.string()))],
    'dense'
)
col_c_type = pa.struct(
    [
        pa.field('Field', union_type)
    ]
)

schema=pa.schema(
    [
        pa.field('ColA', pa.int32()),
        pa.field('ColB', pa.string()),
        pa.field('ColC', col_c_type),
    ]
)

df = pd.DataFrame({
    "ColA": [1, 2, 3],
    "ColB": ["X", "Y", "Z"],
    "ColC": [
        { "Field": "Value" },
        { "Field": "Value2" },
        { "Field": ["Value3"] }
    ]
})

pa.Table.from_pandas(df, schema)
这会导致以下错误:

(“未实现类型联合[dense]的序列转换器”,“具有类型对象的列ColC的转换失败”

即使手动创建箭头表,也无法将其转换为拼花地板(同样,不支持联合)

import io
import pyarrow.parquet as pq

col_a = pa.array([1, 2, 3], pa.int32())
col_b = pa.array(["X", "Y", "Z"], pa.string())

xs = pa.array(["Value", "Value2", None], type=pa.string())
ys = pa.array([None, None, ["value3"]], type=pa.list_(pa.string()))
types = pa.array([0, 0, 1], type=pa.int8())

col_c = pa.UnionArray.from_sparse(types, [xs, ys])

table = pa.Table.from_arrays(
    [col_a, col_b, col_c],
    schema=pa.schema([
        pa.field('ColA', col_a.type),
        pa.field('ColB', col_b.type),
        pa.field('ColC', col_c.type),
    ])
)

with io.BytesIO() as buffer:
    pq.write_table(table, buffer)
Unhandled type for Arrow to Parquet schema conversion: sparse_union<0: string=0, 1: list<item: string>=1>
df = pd.DataFrame({
    "ColA": [1, 2, 3],
    "ColB": ["X", "Y", "Z"],
    "ColC": [
        { "Field1": "Value" },
        { "Field1": "Value2" },
        { "Field2": ["Value3"] }
    ]
})

df.to_parquet('/tmp/hello')