熊猫lambda函数...更快的计算

时间:2019-10-01 09:33:28

标签: python pandas

我有dataframedates中的以下codes

df = pd.DataFrame(
    {'date': list(pd.date_range(start='2018-01-01', end='2018-12-30')) * 364,
     'code': np.random.permutation(list(np.arange(23001, 23001 + 8281)) * 16)}
).sort_values('date', ascending=True).reset_index(drop=True)

我想要的是,对于在code发生的每个specific time,都要计算在同一日期之前或同一日期发生的所有相同的code

def nb_code_at_date(x):
    condition = (df['date'] <= x['date'])
    return (df.loc[condition, 'code'] == x['code']).sum()

问题显然是为“大型”数据框计算该时间:

%%timeit
df.head(1000).apply(lambda x: nb_code_at_date(x), axis=1)
>> 2.89 s ± 283 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

您如何处理以增加等待时间?

2 个答案:

答案 0 :(得分:0)

我发现的另一个解决方案是使用pandas.crosstab函数来计算预定义的数据框,该数据框可以立即使用并已修复。

temp = pd.crosstab(df['date'], df['code'])

def nb_code_at_date2(x):
    condition = (temp.index <= x['date'])
    return (temp.loc[condition, x['code']]).sum()

%%timeit
df.head(1000).apply(lambda x: nb_code_at_date2(x), axis=1)
>>750 ms ± 73.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

答案 1 :(得分:0)

可以使用GroupBy.cumcountGroupBy.transform完成任务:

output = df.join(df.groupby(["code"]).cumcount().add(1).to_frame())
output = output.groupby(["code", "date"]).transform("max")