[英]Count of rows linked by ids in Pandas dataframe
我有一个 id 表和以前的 id(见图 1),我想计算一个链中链接的唯一 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'])
首先将convert_matrix.from_pandas_edgelist
与connected_components
一起使用,然后创建映射字典,通过 Series.map 获取每个组的第一个映射值,由Series.map
过滤,最后通过Series.duplicated
添加新列, mapp
Counter
为Series.map
字典:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.