包含字符串列表的聚合列,其中元素与极坐标相交

29a*_*oac 5 python list aggregation dataframe python-polars

我正在尝试将数据框中的一些行与列聚合list[str]。对于每个索引,我需要组中所有列表的交集。不确定我是否想太多,但我现在无法提供解决方案。有什么帮助吗?

\n
import polars as pl    \ninput_df = pl.DataFrame(\n   {"idx": [1,1,2,2,3,3], \n    "values": [["A", "B"], ["B", "C"], ["A", "B"], ["B", "C"], ["A", "B"], ["B", "C"]]\n   }\n)\n\noutput_df = input_df.agg(...)\n\n>>> input_df\nshape: (6, 2)\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 idx \xe2\x94\x86 values     \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 1   \xe2\x94\x86 ["B", "C"] \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 ["A", "B"] \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 ["B", "C"] \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 ["A", "B"] \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 ["B", "C"] \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>>> output_df # Expected output\nshape: (3, 2)\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\x90\n\xe2\x94\x82 idx \xe2\x94\x86 values    \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\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 ["B"]     \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 ["B"]     \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 ["B"]     \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\x98\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过一些东西但没有成功

\n
>>> input_df.group_by("idx").agg(\n  pl.reduce(function=lambda acc, x: acc.list.set_intersection(x), \n     exprs=pl.col("values"))\n)\nshape: (3, 2)\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\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\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 idx \xe2\x94\x86 values                   \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 ---                      \xe2\x94\x82\n\xe2\x94\x82 i64 \xe2\x94\x86 list[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\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\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 [["A", "B"], ["B", "C"]] \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 [["A", "B"], ["B", "C"]] \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 [["A", "B"], ["B", "C"]] \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\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\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

另一个

\n
>>> input_df.group_by("idx").agg(\n   pl.reduce(function=lambda acc, x: acc.list.set_intersection(x), \n   exprs=pl.col("values").explode())\n)\nshape: (3, 2)\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\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 idx \xe2\x94\x86 values            \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\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 3   \xe2\x94\x86 ["A", "B", \xe2\x80\xa6 "C"] \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 ["A", "B", \xe2\x80\xa6 "C"] \xe2\x94\x82\n\xe2\x94\x82 1   \xe2\x94\x86 ["A", "B", \xe2\x80\xa6 "C"] \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\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

jqu*_*ous 5

我不确定这是否像看起来那么简单。

\n

您可以摆脱列表并使用“常规”Polars 功能。

\n

检查组的每一行中是否包含值的一种方法idx是计算每个组中唯一(不同)行号的数量idx, values

\n
(df.with_columns(group_len = pl.count().over("idx"))\n   .with_row_count()\n   .explode("values")\n   .with_columns(num_rows =\n       pl.n_unique("row_nr").over("idx", "values")\n   )\n)\n
Run Code Online (Sandbox Code Playgroud)\n
shape: (12, 5)\n\xe2\x94\x8c\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\xac\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\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\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\x90\n\xe2\x94\x82 row_nr \xe2\x94\x86 idx \xe2\x94\x86 values \xe2\x94\x86 group_len \xe2\x94\x86 num_rows \xe2\x94\x82\n\xe2\x94\x82 ---    \xe2\x94\x86 --- \xe2\x94\x86 ---    \xe2\x94\x86 ---       \xe2\x94\x86 ---      \xe2\x94\x82\n\xe2\x94\x82 u32    \xe2\x94\x86 i64 \xe2\x94\x86 str    \xe2\x94\x86 u32       \xe2\x94\x86 u32      \xe2\x94\x82\n\xe2\x95\x9e\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\xaa\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\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\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\xa1\n\xe2\x94\x82 0      \xe2\x94\x86 1   \xe2\x94\x86 A      \xe2\x94\x86 2         \xe2\x94\x86 1        \xe2\x94\x82\n\xe2\x94\x82 0      \xe2\x94\x86 1   \xe2\x94\x86 B      \xe2\x94\x86 2         \xe2\x94\x86 2        \xe2\x94\x82 # row_nr = [0, 1]\n\xe2\x94\x82 1      \xe2\x94\x86 1   \xe2\x94\x86 B      \xe2\x94\x86 2         \xe2\x94\x86 2        \xe2\x94\x82\n\xe2\x94\x82 1      \xe2\x94\x86 1   \xe2\x94\x86 C      \xe2\x94\x86 2         \xe2\x94\x86 1        \xe2\x94\x82\n\xe2\x94\x82 2      \xe2\x94\x86 2   \xe2\x94\x86 A      \xe2\x94\x86 2         \xe2\x94\x86 1        \xe2\x94\x82\n\xe2\x94\x82 2      \xe2\x94\x86 2   \xe2\x94\x86 B      \xe2\x94\x86 2         \xe2\x94\x86 2        \xe2\x94\x82 # row_nr = [2, 3]\n\xe2\x94\x82 3      \xe2\x94\x86 2   \xe2\x94\x86 B      \xe2\x94\x86 2         \xe2\x94\x86 2        \xe2\x94\x82\n\xe2\x94\x82 3      \xe2\x94\x86 2   \xe2\x94\x86 C      \xe2\x94\x86 2         \xe2\x94\x86 1        \xe2\x94\x82\n\xe2\x94\x82 4      \xe2\x94\x86 3   \xe2\x94\x86 A      \xe2\x94\x86 2         \xe2\x94\x86 1        \xe2\x94\x82\n\xe2\x94\x82 4      \xe2\x94\x86 3   \xe2\x94\x86 B      \xe2\x94\x86 2         \xe2\x94\x86 2        \xe2\x94\x82 # row_nr = [4, 5]\n\xe2\x94\x82 5      \xe2\x94\x86 3   \xe2\x94\x86 B      \xe2\x94\x86 2         \xe2\x94\x86 2        \xe2\x94\x82\n\xe2\x94\x82 5      \xe2\x94\x86 3   \xe2\x94\x86 C      \xe2\x94\x86 2         \xe2\x94\x86 1        \xe2\x94\x82\n\xe2\x94\x94\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\xb4\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\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\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\x98\n
Run Code Online (Sandbox Code Playgroud)\n

您可以过滤这些内容,并使用以下命令构建结果列表.group_by

\n
(df.with_columns(group_len = pl.count().over("idx"))\n   .with_row_count()\n   .explode("values")\n   .filter(\n       pl.n_unique("row_nr").over("idx", "values")\n        == pl.col("group_len")\n   )\n   .group_by("idx", maintain_order=True)\n   .agg(pl.col("values").unique())\n)\n
Run Code Online (Sandbox Code Playgroud)\n
shape: (3, 2)\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\x90\n\xe2\x94\x82 idx \xe2\x94\x86 values    \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\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 ["B"]     \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x86 ["B"]     \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x86 ["B"]     \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\x98\n
Run Code Online (Sandbox Code Playgroud)\n