由工厂重新采样的 Pandas 数据帧聚合太慢

数据挖掘 Python 熊猫 数据框 聚合
2021-10-06 15:04:49

鉴于此测试数据:

import pandas as pd 
import numpy as np 

data = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994', '2014-05-02 18:47:05.178768', '2014-05-02 18:47:05.230071', '2014-05-02 18:47:05.230071', '2014-05-02 18:47:05.280592', '2014-05-03 18:47:05.332662', '2014-05-03 18:47:05.385109', '2014-05-04 18:47:05.436523', '2014-05-04 18:47:05.486877'], 
        'battle_deaths': [34, 25, 26, 15, 15, 14, 26, 25, 62, 41], 'prisioners': [3, 4, 3, 2, 2, 6, 4, 5, 2, 8]}
df = pd.DataFrame(data, columns = ['date', 'battle_deaths', 'prisioners'])

设置索引日期时间:

df = df.set_index(pd.DatetimeIndex(df['date']), drop=True)
del df['date']

当我想重新采样到毫秒时它可以工作,但它需要太长时间......

timeit df.resample('1L').sum()

我猜是因为正在用 NaN 数据聚合所有毫秒,但是当我放弃它时..

timeit df.resample('1L').sum().dropna()

它需要更长的时间

在此处输入图像描述

再次猜测 dropna 是在最后完成的......有什么方法可以通过丢弃 NaN 样本来加速这个过程?

1个回答

看来您并不想使用重采样。您将立即丢弃重新采样的数据。我认为您真正需要的是在同一毫秒内简单地分组记录。这可以通过以下方式完成:

截断到毫秒并分组

df['milliseconds'] = df['date'].str[:-3]
grouped_and_summed = df.groupby(df.milliseconds).sum()

测试代码

import pandas as pd
import numpy as np

data = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994',
                 '2014-05-02 18:47:05.178768', '2014-05-02 18:47:05.230071',
                 '2014-05-02 18:47:05.230071', '2014-05-02 18:47:05.280592',
                 '2014-05-03 18:47:05.332662', '2014-05-03 18:47:05.385109',
                 '2014-05-04 18:47:05.436523',
                 '2014-05-04 18:47:05.486877'],
        'battle_deaths': [34, 25, 26, 15, 15, 14, 26, 25, 62, 41],
        'prisioners': [3, 4, 3, 2, 2, 6, 4, 5, 2, 8]}
df = pd.DataFrame(data, columns=['date', 'battle_deaths', 'prisioners'])

df['milliseconds'] = df['date'].str[:-3]
print(df.groupby(df.milliseconds).sum())

结果:

                         battle_deaths  prisioners
milliseconds                                      
2014-05-01 18:47:05.069             34           3
2014-05-01 18:47:05.119             25           4
2014-05-02 18:47:05.178             26           3
2014-05-02 18:47:05.230             30           4
2014-05-02 18:47:05.280             14           6
2014-05-03 18:47:05.332             26           4
2014-05-03 18:47:05.385             25           5
2014-05-04 18:47:05.436             62           2
2014-05-04 18:47:05.486             41           8