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