假设您希望根据子字符串(以--
分隔)合并组,不幸的是,这并不简单.您不能将其矢量化,因为一个组的成员可以链接到另一个组,而另一个组链接到另一个组,等等.
一种 Select 是使用图论来识别连接的组件.你可以用networkx
和connected_components
来做:
import networkx as nx
G = nx.from_pandas_edgelist(df.with_columns(pl.col('values').str.split('--'))
.explode('values'), source='id', target='values')
S = set(df['id'])
mapper = {n: i for i, c in enumerate(nx.connected_components(G)) for n in c&S}
# {1: 0, 2: 0, 3: 0, 4: 0, 5: 1}
out = df.group_by(pl.col('id').replace(mapper).alias('group')).agg(pl.all())
输出:
shape: (2, 3)
┌───────┬─────────────┬──────────────────────┐
│ group ┆ id ┆ values │
│ --- ┆ --- ┆ --- │
│ i64 ┆ list[i64] ┆ list[str] │
╞═══════╪═════════════╪══════════════════════╡
│ 0 ┆ [1, 2, … 4] ┆ ["A", "B", … "C--A"] │
│ 1 ┆ [5] ┆ ["D"] │
└───────┴─────────────┴──────────────────────┘
图表: