如何有效地计算列中每个元素的子元素数量?

Posted

技术标签:

【中文标题】如何有效地计算列中每个元素的子元素数量?【英文标题】:How to efficiently count the number of children for each element in a column? 【发布时间】:2021-06-12 06:17:27 【问题描述】:

我有一个数据框df,如下所示。

    parent_id   name
0   t3_35jfjt   t1_cr4y72v
1   t3_35jfjt   t1_cr4y7m7
2   t3_35jfjt   t1_cr4y7p3
3   t1_cr4y72v  t1_cr4y92z
4   t3_35jfjt   t1_cr4y986
... ...         ...

其中name 列中的所有元素都是唯一的。我想创建一个字典,其键是name 列中的元素。对于每个这样的键,我们在列parent_id 上计算它的频率。如果没有出现在parent_id列,那么这个key的值当然是0。

我这样做如下,但它效率不高,因为我有超过 300 万行。能否请您详细说明一种更有效的方法?

import pandas as pd
import numpy as np
df = pd.read_csv('https://raw.githubusercontent.com/leanhdung1994/WebMining/main/df.csv', header = 0)

# Create df2 to contain the counts
df2 = df.groupby(by = 'parent_id', as_index = False).size()

# Join df2 and df based on column "parent_id"
df3 = pd.merge(df, df2, how = 'left', left_on= 'name', right_on= 'parent_id')

# Replace NaN with 0
df4 = df3.fillna(0).rename(columns = 'size': 'num_siblings')
df5 = df4[['name', 'num_siblings']]

# My expected dictionary
df5.set_index('name').T.to_dict('records')[0]

是的

't1_cr4y72v': 27.0,
 't1_cr4y7m7': 26.0,
 't1_cr4y7p3': 148.0,
 't1_cr4y92z': 0.0,
 't1_cr4y986': 43.0,
 't1_cr4ya0g': 11.0,
 't1_cr4yai8': 1.0,
....

【问题讨论】:

您能否分享预期的输出,以便我们知道您在寻找什么。我认为转换应该可以解决问题,但希望看到预期结果为您提供解决方案 我做了一个len(pd.unique(df['name'])) 并找到了12718。有12718 行。所以看起来df 中的每一行都是name 的唯一值。所以如果你想要一个字典,那么它将有 name12718 键,计数为 1。这是你想要的吗? 备选方案,我们可以通过't3_35jfjt':4 为每个parent_id 提供name 的计数。那会是更好的解决方案吗?同样,一旦我们知道您的预期输出是什么,我们就可以解决它 @JoeFerndz 请查看我的编辑。 df.groupby('parent_id').count().to_dict() 【参考方案1】:

你想要这样的东西吗:

import pandas as pd
import numpy as np
df = pd.read_csv('https://raw.githubusercontent.com/leanhdung1994/WebMining/main/df.csv', header = 0)

# Create df2 to contain the counts
df2 = df.groupby(by = 'parent_id').size()

df2.reindex(df['name'], fill_value=0).to_dict()

【讨论】:

Exactlyyy :)) 非常感谢您的帮助! 是的。我打算推荐同样的东西。 太棒了,非常感谢@JoeFerndz! 你也可以给d = df.groupby('parent_id').agg('count').to_dict()。我认为你应该得到相同的结果

以上是关于如何有效地计算列中每个元素的子元素数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地计算另一列中每个元素的较小元素的数量?

如何在有序字典中获得正确数量的子元素?

mysql查询以获取列中每个元素的计数

如何使用 Diesel 计算数组列中不同元素的数量?

每个元素小于某个特定数字的子数组的总和

CSS 可以检测元素的子元素数量吗?