在pandas数据fram中按具有分号分隔值的列分组

2024-10-01 04:50:05 发布

您现在位置:Python中文网/ 问答频道 /正文

假设一个pandas数据帧由

import pandas as pd

df = pd.DataFrame({
    'id': range(5),
    'vmns': ('nan', 'a', 'a;b', 'c', 'b')
})

下表如下

^{pr2}$

现在我希望按vmns列分组,但请注意vmnsid = 2的分号分隔值。这应该被解释为a或{},因此在这些值之间创建一个链接。因此,生成的表应该如下所示

   id vmns  group
0   0  nan      0
1   1    a      1
2   2  a;b      1
3   3    c      2
4   4    b      1

有什么建议吗?在


Tags: 数据importiddataframepandasdf链接as
1条回答
网友
1楼 · 发布于 2024-10-01 04:50:05

我继续使用networkx创建了一个解决方案。如下所示(扩展示例)

import networkx as nx
import pandas as pd

df = pd.DataFrame({
    'id': range(7),
    'vmns': ('nan', 'a', 'a;b;c', 'c', 'b', 'd;e', 'e')
})

它产生了

^{pr2}$

然后我从没有分号的行创建节点,从有分号的行创建边。忽略带有nan的行。在

# determine which rows contains nodes and which contains edges
edges_mask = df['vmns'].str.contains(';')
nodes_mask = ~df['vmns'].str.contains(';') & (df['vmns'] != 'nan')

def create_pairwise_edges(lst):
    return [(lst[0], value) for value in lst[1:]]

# create the graph with nodes and edges
G = nx.Graph()
G.add_nodes_from(df.loc[nodes_mask, 'vmns'])
G.add_edges_from([st for row in df.loc[edges_mask, 'vmns'].str.split(';').map(create_pairwise_edges) for st in row])

# determine the connected components and write to df
Gcc = nx.connected_components(G)
new_map = dict()
for g, ids in enumerate(Gcc):
    for id in ids:
        new_map[id] = g
new_map['nan'] = 'nan'
df['combined_group'] = df['vmns'].str.split(';').map(lambda x: new_map[x[0]])

结果是

^{4}$

相关问题 更多 >