使用有限的资源(RAM)创建大型DataFrame

时间:2017-06-03 07:50:43

标签: python pandas dataframe python-2.x

我有一个非常大的pandas.Series形状(200000, )包含dict

In[11]: series.head()
Out[12]: 
train-1        {u'MI vs KKR': 7788, u'India vs Australia 2nd ...
train-10       {u'England Smarter with the Ball': 92, u'Dhoni...
train-100      {u'Star Sports 4': 13, u'Manchester United vs ...
train-1000     {u'SRH vs RCB': 701, u'KKR vs KXIP': 1042, u'M...
train-10000    {u'MI vs KKR': 304, u'Yeh Rishta Kya Kehlata H...
Name: titles, dtype: object

我想从系列中创建一个DataFrame - 可以通过以下方式完成:

df = pd.DataFrame(series.values.tolist(), index=series.index).fillna(0)

从上面的代码可以清楚地看到,我想为所有字典中的每个唯一键创建一个列,如果没有填充零,则填写数字值(如果没有填充它) - 这是由fillna(0)

无法显示我想要的数据集,但下面简要介绍一下使用小型虚拟数据我想做的代码:

small_series = pd.Series([{'a':1, 'b': 2}, {'b': 3, 'c': 4}])

small_series
Out[15]: 
0    {u'a': 1, u'b': 2}
1    {u'c': 4, u'b': 3}
dtype: object


pd.DataFrame(small_series.values.tolist()).fillna(0)
Out[17]: 
     a  b    c
0  1.0  2  0.0
1  0.0  3  4.0

嗯,这是直截了当的,但是当词典是巨大的时会出现问题,当我使用上述技术时,它会占用我所有的RAM(16Gigs)和一半的SWAP内存(32 Gigs) )即便如此,它永远不会停止!

我搜索过,人们建议使用稀疏数据结构,但我需要首先创建一个密集的数据,然后我可以将其转换为稀疏数据结构!

请帮我创建数据帧 - 只有16 GB的内存!

这是现成的模板,它将提供帮助(title.pic文件(在Python 2.7中的pickle')):

import pickle
import pandas as pd

series = pickle.load(open('titles.pic', 'rb'))


# print series

# This is where it take up the whole memory and forever long!
df = pd.DataFrame(series.values.tolist(), index=series.index).fillna(0)

任何帮助/方法都将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的数据帧将具有200k * 10k = 20亿个元素,如果每个元素仅为1个字节,则大致转换为2GB。显然,密集表示不起作用,因此您需要使用SparseDataFrame

pd.SparseDataFrame.from_records(small_series.values)