首页 文章

大熊猫填补了性能问题

提问于
浏览
4

我有一个带有多索引(Date,InputTime)的数据帧,这个数据帧可能包含列中的一些NA值(Value,Id) . 我想填写前瞻性 Value ,但仅限日期,我无论如何都无法以非常有效的方式做到这一点 .

这是我拥有的数据帧类型:

Dataframe example

这是我想要的结果:

Dataframe properly fill forward by date only

因此,为了按日期正确填写,我可以使用groupby(level = 0)函数 . groupby很快但是按日期对数据帧组应用的填充函数实际上太慢了 .

这是我用来比较简单填充的代码(它没有给出预期的结果但运行得非常快)和预期的按日期填充(这给出了预期的结果,但实际上太慢了) .

import numpy as np
import pandas as pd
import datetime as dt

# Show pandas & numpy versions
print('pandas '+pd.__version__)
print('numpy '+np.__version__)

# Build a big list of (Date,InputTime,Value,Id)
listdata = []
d = dt.datetime(2001,10,6,5)
for i in range(0,100000):
    listdata.append((d.date(), d, 2*i if i%3==1 else np.NaN, i if i%3==1 else np.NaN))
    d = d + dt.timedelta(hours=8)

# Create the dataframe with Date and InputTime as index
df = pd.DataFrame.from_records(listdata, index=['Date','InputTime'], columns=['Date', 'InputTime', 'Value', 'Id'])

# Simple Fill forward on index
start = dt.datetime.now()
for col in df.columns:
    df[col] = df[col].ffill()
end = dt.datetime.now()
print "Time to fill forward on index = " + str((end-start).total_seconds()) + " s"

# Fill forward on Date (first level of index)
start = dt.datetime.now()
for col in df.columns:
    df[col] = df[col].groupby(level=0).ffill()
end = dt.datetime.now()
print "Time to fill forward on Date only = " + str((end-start).total_seconds()) + " s"

Results

有人可以解释一下为什么这段代码太慢或者帮助我找到一个有效的方法来按日期填写大数据帧吗?

谢谢

1 回答

  • 0

    github / jreback:这是#7895的骗局 . .ffill没有在groupby操作的cython中实现(虽然它当然可以),而是在每个组上调用python空间 . 这是一个简单的方法 . 网址:https://github.com/pandas-dev/pandas/issues/11296

    根据jreback的回答,当你做一个groupby时,ffill()没有优化,但是cumsum()是 . 试试这个:

    df = df.sort_index()
    df.ffill() * (1 - df.isnull().astype(int)).groupby(level=0).cumsum().applymap(lambda x: None if x == 0 else 1)
    

相关问题