这是我拥有的数据帧类型:
这是我想要的结果:
因此,为了按日期正确填写,我可以使用groupby(level = 0)函数. groupby很快但是按日期对数据帧组应用的填充函数实际上太慢了.
这是我用来比较简单填充的代码(它没有给出预期的结果但运行得非常快)和预期的按日期填充(这给出了预期的结果,但实际上太慢了).
import numpy as npimport pandas as pdimport datetime as dt# Show pandas & numpy versionsprint('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 indexdf = pd.DataFrame.from_records(Listdata,index=['Date','inputTime'],columns=['Date','inputTime','Value','ID'])# Simple Fill forward on indexstart = 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"
有人可以解释一下为什么这段代码太慢或帮我找到一个有效的方法来填写大数据帧的日期?
谢谢
解决方法 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)总结
以上是内存溢出为你收集整理的python – pandas填补了性能问题全部内容,希望文章能够帮你解决python – pandas填补了性能问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)