Polars 表将列表列转换为单独的行,即将列表列取消嵌套为多行

kri*_*anp 7 python-polars

我有一个以下形式的 Polars 数据框:

\n
df = pl.DataFrame({\'a\':[1,2,3], \'b\':[[\'a\',\'b\'],[\'a\'],[\'c\',\'d\']]}) \n
Run Code Online (Sandbox Code Playgroud)\n
\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 a   \xe2\x94\x86 b          \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 ---        \xe2\x94\x82\n\xe2\x94\x82 i64 \xe2\x94\x86 list[str]  \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 ["a", "b"] \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 ["a"]      \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 ["c", "d"] \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

我想将其转换为以下形式。我计划保存到 parquet 文件,并查询该文件(使用 sql)。

\n
\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 a   \xe2\x94\x86 b   \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 --- \xe2\x94\x82\n\xe2\x94\x82 i64 \xe2\x94\x86 str \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 "a" \xe2\x94\x82\n\xe2\x94\x82 1   \xe2\x94\x86 "b" \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 "a" \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 "c" \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 "d" \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

我看到了一个适用于 struct columns 的答案,但df.unnest(\'b\')在我的数据上会导致错误:

\n
SchemaError: Series of dtype: List(Utf8) != Struct\n
Run Code Online (Sandbox Code Playgroud)\n

我还发现了一个 github 问题,显示列表可以转换为结构,但我无法弄清楚如何做到这一点,或者它是否适用于此处。

\n

gle*_*com 7

要分解列Lists,您可以使用.explode()方法( doc )

\n
df = pl.DataFrame({\'a\':[1,2,3], \'b\':[[\'a\',\'b\'],[\'a\'],[\'c\',\'d\']]})\n\ndf.explode("b")\n
Run Code Online (Sandbox Code Playgroud)\n
\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 a   \xe2\x94\x86 b   \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 --- \xe2\x94\x82\n\xe2\x94\x82 i64 \xe2\x94\x86 str \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 a   \xe2\x94\x82\n\xe2\x94\x82 1   \xe2\x94\x86 b   \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 a   \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 c   \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 d   \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n