从匹配对的行创建节点列表

时间:2019-05-21 15:39:38

标签: python pandas merge

不知道这是否可以通过熊猫来完成,或者我是否需要编写具有一定逻辑的循环。

我有一些表示成对的节点链的数据:

pairs = [
    # A1 -> B1 -> C1
    {'source': 'A1', 'target': 'B1'},
    {'source': 'B1', 'target': 'C1'},
    # A1 -> D1
    {'source': 'A1', 'target': 'D1'},
    # C2 -> A2 -> B2
    {'source': 'C2', 'target': 'A2'},
    {'source': 'A2', 'target': 'B2'},
]

我想解析这些链以创建它们包含的节点列表:

results = [
    ['A1', 'B1', 'C1', 'D1'],
    ['C2', 'A2', 'B2'],
]

到目前为止,我有这段代码可以使我将某些节点匹配在一起:

def pair_nodes(df, src, tgt):
    df = df.groupby([src]).agg({tgt: 'unique'}).reset_index()
    df['nodes'] = df.apply(lambda r: np.append(r[src], r[tgt]), axis=1)
    return df


df1 = pair_nodes(df, 'source', 'target')
df2 = pair_nodes(df, 'target', 'source')
print(df1)
print(df2)

哪个给我:

  source    target         nodes
0     A1  [B1, D1]  [A1, B1, D1]
1     A2      [B2]      [A2, B2]
2     B1      [C1]      [B1, C1]
3     C2      [A2]      [C2, A2]
  target source     nodes
0     A2   [C2]  [A2, C2]
1     B1   [A1]  [B1, A1]
2     B2   [A2]  [B2, A2]
3     C1   [B1]  [C1, B1]
4     D1   [A1]  [D1, A1]

我被困在那里。我想我缺少的是只要在rows中找到df1df2时,就将sourcetarget中的nodes和{{1}}合并

我看过df.merge,但它似乎只能用于完全匹配的键。

这可以通过熊猫来实现吗?或者我需要编写自定义循环/逻辑来做到这一点?

1 个答案:

答案 0 :(得分:1)

通过合并数据帧创建所需的结果可能是一个复杂的过程。 上面使用的合并登录将无法满足所有类型的图形。看看下面的方法。

# Create graph
graph = {}
for pair in pairs:
    if pair['source'] in graph.keys():
        graph[pair['source']].append(pair['target'])
    else:
        graph[pair['source']] = [pair['target']]

# Graph
print(graph)
{
    'A1': ['B1', 'D1'], 
    'B1': ['C1'], 
    'C2': ['A2'], 
    'A2': ['B2']
}

# Generating list of nodes
start = 'A1' # Starting node parameter
result = [start]
for each in result:
    if each in graph.keys():
        result.extend(graph[each])
    result = list(set(result))

# Output
print(result)
['A1', 'B1', 'C1', 'D1']