我有一个具有多索引(日期、输入时间)的数据框,该数据框可能在列(值、Id)中包含一些 NA 值。我想填充远期值,但仅按日期填充,但我找不到以非常有效的方式执行此操作的方法。
这是我的数据框类型:
这是我想要的结果:
因此,为了按日期正确填充,我可以使用 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"
有人可以解释一下为什么这段代码如此慢,或者帮助我找到一种有效的方法来在大数据帧上按日期向前填充吗?
Thanks