Python 熊猫填补远期业绩问题

Python 熊猫填补远期业绩问题,python,performance,pandas,Python,Performance,Pandas,我有一个带有多索引(日期、输入时间)的数据框,这个数据框可能在列(值、Id)中包含一些NA值。我想填写远期价值,但只按日期填写,我觉得无论如何都不能以非常有效的方式填写 以下是我拥有的数据帧类型: 这是我想要的结果: 所以,为了正确地按日期填充,我可以使用groupby(level=0)函数。groupby很快,但是应用于dataframe group by date的fill函数实在太慢了 import numpy as np import pandas as pd import date

我有一个带有多索引(日期、输入时间)的数据框,这个数据框可能在列(值、Id)中包含一些NA值。我想填写远期价值,但只按日期填写,我觉得无论如何都不能以非常有效的方式填写

以下是我拥有的数据帧类型:

这是我想要的结果:

所以,为了正确地按日期填充,我可以使用groupby(level=0)函数。groupby很快,但是应用于dataframe group by date的fill函数实在太慢了

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"
下面是我用来比较simple fill forward(它没有给出预期的结果,但是运行得非常快)和expected fill forward by date(它给出了预期的结果,但是速度太慢)的代码

有人能解释一下为什么这段代码这么慢,或者帮我找到一种有效的方法在大数据帧上按日期填充


谢谢

github/jreback:这是一个#7895的复制品。ffill不是在groupby操作的cython中实现的(尽管它当然可以),而是在每个组上调用python空间。 这里有一个简单的方法。 网址:

根据jreback的回答,当您执行groupby时,ffill()不是优化的,但是cumsum()是优化的。试试这个:
为什么需要迭代cols?如果你没有设置这些列的索引,只是这样做:
df.groupby(['Date','InputTime']).fillna()
这不会给你想要的吗?男孩,这个答案应该更受欢迎!多快的速度啊!谢谢一个方便的函数:```def ffill\u se(df,group\cols):df['group']=df.groupby(group\u cols).ngroup()df.set\u index(['group'],inplace=True)df.sort\u index(inplace=True)df=df.ffill()*(1-df.isnull().astype(int)).groupby(level=0).cumsum().applymap(lambda x:None如果x==0,则为1)df.reset\u index(就地=真,下降=真)返回df```
df = df.sort_index()
df.ffill() * (1 - df.isnull().astype(int)).groupby(level=0).cumsum().applymap(lambda x: None if x == 0 else 1)