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

Posted

技术标签:

【中文标题】如何有效地计算另一列中每个元素的较大元素的数量?【英文标题】:How to efficiently count the number of larger elements for every elements in another column? 【发布时间】:2021-06-12 07:55:43 【问题描述】:

我有以下df

    name        created_utc
0   t1_cqug90j  1430438400
1   t1_cqug90k  1430438400
2   t1_cqug90z  1430438400
3   t1_cqug91c  1430438401
4   t1_cqug91e  1430438401
... ...         ...

其中name 列中的所有值都是唯一的。我想创建一个字典,其键与name 列中的元素相同。每个这样的键的值是列created_utc 中大于键的元素数。我的预期结果类似于

't1_cqug90j': 6, 't1_cqug90k': 0, 't1_cqug90z': 3, ... 

本例中created_utc列有6个元素大于1430438400,即t1_cqug90j的对应值。我可以循环生成这样的字典。但是,在我的情况下,循环效率不高,行数超过 300 万。

能否请您详细说明一种更有效的方法?

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

【问题讨论】:

提示:尝试使用第二列作为键对两列进行排序。 广播会起作用,但在内存方面可能会有问题 名称是否唯一? 【参考方案1】:

这是一种可能的方法。我们首先假设您的 name 列是唯一值的。然后我们可以像这样计算created_utc

count_utc = df.groupby('created_utc').size()
cumulative_counts = count_utc.shift(fill_value=0).cumsum()

output = dict(zip(df['name'], df['created_utc'].map(cumulative_counts)) )

那么前几个输出将如下所示:

't1_cqug90j': 0,
 't1_cqug90k': 0,
 't1_cqug90z': 0,
 't1_cqug91c': 3,
 't1_cqug91e': 3,
 't1_cqug920': 5
 ...

现在,如果 name 不是唯一的(由于您的输出期望这不太可能),但在这种情况下,我们当然可以只取 cumulative_counts 的最大值减去 @987654328 的大小@count(?),类似这样:

output = dict(zip(df['name'],
                  df['created_utc'].map(cumulative_counts)
                      .sub(df.groupby('name')['name'].transform('size'))
                      .add(1)                  
                 ) )

【讨论】:

您可能需要在第一行为count_utc 添加.sort_index(ascending=False) 以确保正确计算累积和 @ArjunAriyil 是的,你可以这样做。但是 groupby 默认情况下越来越多地对键进行排序。 是的。但如果我理解正确,我们需要对键进行排序,因为值应该是大于给定日期的日期计数。 @ArjunAriyil 这就是我想说的,你不需要sort_index 因为关键是sorted by groupby by default。所以count_utc 仅使用该命令按索引排序 name's 实际上是独一无二的。您的解决方案效果很好。您能否详细说明一个修改,其中每个这样的键的值是 created_utc 列中的元素数少于键的值?

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

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

熊猫在巨大的csv的每一列中找到独特元素的数量

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

在python中,我如何对一列中每个值与另一列中的值发生的次数(多少行)建立矩阵?

根据另一列中的元素重命名特定列元素

查找并匹配列中的元素并更改另一列中相应行的值