如何统计DataFrame中父节点子节点数(含未出现节点显示0)
如何统计父节点的子节点数(包含未出现节点的0值)
嗨,我来帮你解决这个问题!你想要统计1到10628的连续id序列中每个父节点的子节点数量,包括那些没出现在原DataFrame里的节点(子节点数为0),对吧?其实用不到split()函数,我们可以用pandas的分组和连接操作来轻松实现,具体步骤如下:
步骤1:统计原数据中已有父节点的子节点数
首先,我们对原DataFrame按id分组,统计每个组的行数(也就是子节点的数量):
import pandas as pd # 假设你的原DataFrame是df child_count = df.groupby('id').size().reset_index(name='id_child')
这一步会得到一个新的DataFrame,包含所有在原数据中出现过的id,以及对应的子节点数量。
步骤2:创建完整的连续id序列
因为你的id范围是1到10628的连续值,我们可以用pd.RangeIndex生成这个完整序列,再转成DataFrame:
full_ids = pd.DataFrame({'id': pd.RangeIndex(start=1, stop=10629)})
这里stop=10629是因为RangeIndex的结束值是开区间,这样才能包含10628这个最大值。
步骤3:合并数据并填充0值
最后,我们把完整id序列和之前统计的子节点数做左连接,然后把缺失的子节点数填充为0:
nb_children = full_ids.merge(child_count, on='id', how='left').fillna({'id_child': 0}) # 把id_child列转成整数类型(可选,因为填充后默认是浮点数) nb_children['id_child'] = nb_children['id_child'].astype(int)
这样得到的nb_children就是你想要的结果:包含1到10628的所有id,每个id对应的子节点数,未出现的id对应的子节点数为0。
举个例子,用你给出的小数据集测试:
原df:
| id | id_child |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 4 | 1 |
| 4 | 2 |
执行上述代码后(把stop改成5,因为示例id范围是1到4),得到的nb_children就是:
| id | id_child |
|---|---|
| 1 | 3 |
| 2 | 1 |
| 3 | 0 |
| 4 | 2 |
完全符合你的预期!
内容的提问来源于stack exchange,提问作者Emeline
相关产品推荐
相关产品推荐

