给出这个Polars DataFrame:

df = pl.DataFrame(
    {
        "id": [1, 2, 3, 4, 5],
        "values": ["A", "B", "A--B", "C--A", "D"],           
    }
)

1, How can I group/cluster it so that 1,2 and 3 ends up in the same group?
2. Can I even achieve having 4 in the same group/cluster?

推荐答案

假设您希望根据子字符串(以--分隔)合并组,不幸的是,这并不简单.您不能将其矢量化,因为一个组的成员可以链接到另一个组,而另一个组链接到另一个组,等等.

一种 Select 是使用图论来识别连接的组件.你可以用networkxconnected_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"]                │
└───────┴─────────────┴──────────────────────┘

图表:

enter image description here

Python相关问答推荐

如何从FDaGrid实例中删除某些函数?

配置Sweetviz以分析对象类型列,而无需转换

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

提取两行之间的标题的常规表达

如何避免Chained when/then分配中的Mypy不兼容类型警告?

管道冻结和管道卸载

Telethon加入私有频道

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

给定高度约束的旋转角解析求解

如何更改groupby作用域以找到满足掩码条件的第一个值?

幂集,其中每个元素可以是正或负""""

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

Pandas—堆栈多索引头,但不包括第一列

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

GPT python SDK引入了大量开销/错误超时

没有内置pip模块的Python3.11--S在做什么?

极点替换值大于组内另一个极点数据帧的最大值

Pandas:将值从一列移动到适当的列

PYTHON中的pd.wide_to_long比较慢

如何删除剪裁圆的对角线的外部部分