我有dataframe
和dates
中的以下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)
您如何处理以增加等待时间?
答案 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.cumcount
和GroupBy.transform
完成任务:
output = df.join(df.groupby(["code"]).cumcount().add(1).to_frame())
output = output.groupby(["code", "date"]).transform("max")