我有一个清单。每个单独的列表可以具有不同的长度。列表的每个元素都是元组。
list1 = [("a", 1), ("b", 2)]
list2 = [("c", 3), ("d", 4), ("e", 5)]
我想将它们全部合并到一个类型为 list[struct[2]] 的单个极坐标数据帧列中。
在打印数据框时我应该看到:
column_name
list[struct[2]]
[{"a",1}, {"b",2}]
[{"c",3}, {"d",4}, {"e",5}]
我所做的就是使用下面的代码获取一列 struct[2]
list1 = ["a", "b", "c"]
list2 = [1, 2, 3]
df = pl.DataFrame({
"col1": list1,
"col2": list2
})
print (df)
dfs = df.select(pl.struct(pl.all()).alias("my_struct"))
print(dfs)
但这离我想要实现的目标还相去甚远
假设你希望你的钥匙是
'0', '1', ...
,你可以这样做:
pl.Series(
[[{str(i): val for i, val in enumerate(j)} for j in lst] for lst in [list1, list2]]
)
这给了
Out[26]:
shape: (2,)
Series: '' [list[struct[2]]]
[
[{"a",1}, {"b",2}]
[{"c",3}, {"d",4}, {"e",5}]
]
Polars 中的每一列都有一个架构(“类型”)。
如果我们以
{"a": 1}, {"b": 2}
为例:
df = pl.select(pl.concat_list(pl.struct(a=1), pl.struct(b=2)))
shape: (1, 1)
┌──────────────────────┐
│ a │
│ --- │
│ list[struct[2]] │
╞══════════════════════╡
│ [{1,null}, {null,2}] │ # [{"a": 1, b: None}, {"a": None: b: 2}]
└──────────────────────┘
Polars 确定模式为:
[ {"a": int, "b": int } ]
>>> df.schema
OrderedDict([('a', List(Struct([Field('a', Int32), Field('b', Int32)])))])
这基本上意味着:列中的每个结构都必须具有字段名称。 (按键)
如果我们获取您的起始列表:
a
、b
、c
、d
、e
都是键。
list1 = [("a", 1), ("b", 2)]
list2 = [("c", 3), ("d", 4), ("e", 5)]
如果您想要所显示的结构,那么您本质上是在说您想要这个:
list1 = [{"key": "a", "value": 1}, {"key": "b", "value": 2}]
list2 = [{"key": "c", "value": 3}, {"key": "d", "value": 4}, {"key": "e", "value": 5}]
即您的起始键必须成为实际的值。