Python 数据帧中由ID链接的行数

Python 数据帧中由ID链接的行数,python,pandas,Python,Pandas,我有一个id表和以前的id(参见图1),我想计算一个链中链接的唯一id总数,例如,如果我们将最新id作为“父id”,那么下面示例数据的结果将类似于图2,其中“a”链接到5个总id(a、b、c、d和e),而“w”链接到4个id(w、x、y和z)。实际上,我处理的是随机生成的ID,而不是按顺序排列的字母 生成示例数据帧的Python代码: import pandas as pd raw_data = pd.DataFrame([['a','b'], ['b','c'], ['c', 'd'],

我有一个id表和以前的id(参见图1),我想计算一个链中链接的唯一id总数,例如,如果我们将最新id作为“父id”,那么下面示例数据的结果将类似于图2,其中“a”链接到5个总id(a、b、c、d和e),而“w”链接到4个id(w、x、y和z)。实际上,我处理的是随机生成的ID,而不是按顺序排列的字母

生成示例数据帧的Python代码:

import pandas as pd

raw_data = pd.DataFrame([['a','b'], ['b','c'], ['c', 'd'],['d','e'],['e','-'],
                         ['w','x'], ['x', 'y'], ['y','z'], ['z','-']], columns=['id', 'previous_id'])

output = pd.DataFrame([['a',5],['w',4]], columns = ['parent_id','linked_ids'])
首先与一起使用,然后为映射创建字典,通过筛选获得每组的第一个映射值,最后使用
计数器为
mapp
字典添加新列:

df1 = raw_data[raw_data['previous_id'].ne('-')]

import networkx as nx
from collections import Counter

g = nx.from_pandas_edgelist(df1,'id','previous_id')

connected_components = nx.connected_components(g)

d = {y:i for i, x in enumerate(connected_components) for y in x}
print (d)
{'c': 0, 'e': 0, 'b': 0, 'd': 0, 'a': 0, 'y': 1, 'x': 1, 'w': 1, 'z': 1}

c = Counter(d.values())
mapp = {k: c[v] for k, v in d.items()}
print (mapp)

{'c': 5, 'e': 5, 'b': 5, 'd': 5, 'a': 5, 'y': 4, 'x': 4, 'w': 4, 'z': 4}

df = (raw_data.loc[~raw_data['id'].map(d).duplicated(), ['id']]
            .rename(columns={'id':'parent_id'})
            .assign(linked_ids = lambda x: x['parent_id'].map(mapp)))

print (df)
  parent_id  linked_ids
0         a           5
5         w           4

请以文本形式提供一小部分样本数据,以便我们复制和粘贴。包括相应的期望结果。请查看上的指南。