我有一个非常大的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)
任何帮助/方法都将不胜感激!
答案 0 :(得分:1)
您的数据帧将具有200k * 10k = 20亿个元素,如果每个元素仅为1个字节,则大致转换为2GB。显然,密集表示不起作用,因此您需要使用SparseDataFrame
:
pd.SparseDataFrame.from_records(small_series.values)