首页 > 解决方案 > 如何有效地计算另一列中每个元素的较大元素的数量?

问题描述

我有以下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都是唯一的。我想创建一个字典,其键与 column 中的元素相同name。每个这样的键的值是列中created_utc大于键的元素数。我的预期结果是

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

在这种情况下,列中有 6 个元素created_utc大于 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

标签: pythonpython-3.xpandasdictionarycount

解决方案


这是一种可能的方法。我们首先假设您的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's 不是唯一的(由于您的输出期望这不太可能),但在这种情况下,我们当然可以只取最大值cumulative_counts减去name计数的大小(?),如下所示:

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

推荐阅读