python - Pandas 重采样代码运行速度极慢

标签 python pandas dataframe pandas-groupby

我需要重新采样 Pandas 中的一些数据,我使用下面的代码:

根据我的数据,需要5 小时

df['date'] = pd.to_datetime(df['date'], format='%y-%m-%d')
df = df.set_index('date')
df.groupby('id').resample('D')['value'].agg('sum').loc[lambda x: x>0]

这太慢了。

如何在数据上加快上述代码的速度:

id    date    value

1   16-12-1     9
1   16-12-1     8
1   17-1-1      18
2   17-3-4      19
2   17-3-4      20
1   17-4-3      21
2   17-7-13     12
3   17-8-9      12
2   17-9-12     11
1   17-11-12    19
3   17-11-12    21

giving output:

id  date      
1   2016-12-04    17
    2017-01-01    18
    2017-04-09    21
    2017-11-12    19
2   2017-03-05    39
    2017-07-16    12
    2017-09-17    11
3   2017-08-13    12
    2017-11-12    21
Name: value, dtype: int64

我将日期设置为索引,但代码太慢了。任何帮助都会很棒。

最佳答案

尝试一下。 我将使用 pd.Grouper() 并将频率指定为每天,希望它更快。另外,我正在摆脱 agg 并立即使用 .sum()

df['date'] = pd.to_datetime(df['date'], format='%y-%m-%d')
df = df.set_index('date')
df2 = df.groupby(['id',pd.Grouper(freq='D')])['value'].sum()

结果:

id  date      
1   2016-12-01    17
    2017-01-01    18
    2017-04-03    21
    2017-11-12    19
2   2017-03-04    39
    2017-07-13    12
    2017-09-12    11
3   2017-08-09    12
    2017-11-12    21

希望这能起作用。

[编辑]

所以我只是在随机生成的 100000 行 df 上对这两种方法进行了一个小测试

df = pd.DataFrame(np.random.randint(0, 30,size=100000),
                  columns=["id"],
                  index=pd.date_range("19300101", periods=100000))
df['value'] = np.random.randint(0, 10,size=100000)

并在这两个代码上进行了尝试,结果是:

使用resmple:

startTime = time.time()
df2 = df.groupby('id').resample('D')['value'].agg('sum').loc[lambda x: x>0]
print(time.time()-startTime)
1.0451831817626953 seconds

使用pd.Grouper():

startTime = time.time()
df3 = df.groupby(['id',pd.Grouper(freq='D')])['value'].sum()
print(time.time()-startTime)
0.08430838584899902 seconds

大约快12倍!(如果我的数学正确的话)

关于python - Pandas 重采样代码运行速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55722068/

相关文章:

python - 如何有效地填充时间序列?

python - 基于 Pandas DataFrame 中另一列的 Sum 列

python - 无法借助 nltk 的正则表达式删除特殊字符

python - 将数据帧附加到 sqlite3 表,BLOB 而不是时间戳

python - Django select_lated 查询不会将所有值返回到模板

Python:如果两列具有相同的值,则对第三列的值求和

python - Pandas 数据框中的条件列算法

python - 如何计算两个日期/时间之间的实例数

python - 我的 pythonpath 有 'register2',为什么我不能导入它

python - 在两次打印输出中检查文本文件更新结果