我有一个巨大的数据框架,大约有1041507行。
我想在我的数据框架中的某些类别下,为某些值计算一个rolling_median。为此,我使用了一个通过apply进行折叠的groupBy:
df['rolling_median']=df['value'].groupby(['Category','Subcategory']).apply(pd.rolling_median,7,min_periods=7)然而,这给了我一个MemoryError: skiplist_insert失败。如果需要的话,我会附上完整的回溯,但我看到了另一篇类似的文章,其中指出这是熊猫的一个问题,如https://github.com/pydata/pandas/issues/11697所见。非常大的尺寸>~ 35000
在此之后,我尝试进行一些操作,通过分别迭代每个组来获得滚动中值。
for index,group in df.groupby(['Category','Subcategory']):
print pd.rolling_median(group['value'],7,min_period=7)每组只有20-25行长。然而,这个函数会失败,并在几次迭代后显示相同的MemoryError。我多次运行代码,每次它都显示不同项的内存错误。
我为任何人创建了一些虚拟值以供测试,如下所示:
index=[]
[index.append(x) for y in range(25) for x in np.arange(34000)]
sample=pd.DataFrame(np.arange(34000*25),index=index)
for index,group in sample.groupby(level=0):
try:
pd.rolling_median(group[0],7,7)
except MemoryError:
print a
print pd.rolling_median(group[0],7,7)如果我在遇到rolling_median后再次运行memoryError (正如您在上面的代码中看到的那样),它将正常运行,没有另一个例外-
我不知道如何计算我的rolling_median,如果它一直抛出内存错误。有人能告诉我一种更好的方法来计算rolling_median,或者在这里帮助我理解这个问题吗?
发布于 2016-03-10 14:24:53
这群人看上去不对,应该改变
df['rolling_median']=df['value'].groupby(['Category','Subcategory']).apply(pd.rolling_median,7,min_periods=7)至
df['rolling_median']=df.groupby(['Category','Subcategory'])['value'].apply(pd.rolling_median,7,min_periods=7)否则,groupby将无法工作,因为它是一个列名为"value“的系列,因此不能将‘分组’、‘子类别’作为不存在的列。
而且,groupby将小于dataframe的长度,并且创建df‘滚动_中位数’将导致长度不匹配。
希望这能有所帮助。
发布于 2016-04-04 12:12:30
该bug已在Pandas 0.18.0中修复,现在rolling_mean()和rolling_median()方法已经贬值。
这是一个错误:https://github.com/pydata/pandas/issues/11697
可以在这里查看:http://pandas.pydata.org/pandas-docs/stable/computation.html
https://stackoverflow.com/questions/35918402
复制相似问题