繁体   English   中英

Pandas dataframe 中由 id 链接的行数

[英]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,而不是排序的字母。

Image1 - 原始数据

Tamge2 - 输出

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_edgelistconnected_components一起使用,然后创建映射字典,通过 Series.map 获取每个组的第一个映射值,由Series.map过滤,最后通过Series.duplicated添加新列, mapp CounterSeries.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM