Python 使用熊猫创建带有序列的数据帧,导致内存错误

Python 使用熊猫创建带有序列的数据帧,导致内存错误,python,numpy,pandas,Python,Numpy,Pandas,我正在使用熊猫图书馆进行遥感时间序列分析。最后,我想通过使用块大小将数据帧保存到csv,但我遇到了一个小问题。我的代码生成6个NumPy数组,并将其转换为Pandas系列。每个系列都包含许多项目 >>> prcpSeries.shape (12626172,) 我想将该系列添加到熊猫数据帧(df)中,以便将它们逐块保存到csv文件中 d = {'prcp': pd.Series(prcpSeries), 'tmax': pd.Series(tmaxSeries),

我正在使用熊猫图书馆进行遥感时间序列分析。最后,我想通过使用块大小将数据帧保存到csv,但我遇到了一个小问题。我的代码生成6个NumPy数组,并将其转换为Pandas系列。每个系列都包含许多项目

>>> prcpSeries.shape
(12626172,)
我想将该系列添加到熊猫数据帧(df)中,以便将它们逐块保存到csv文件中

d = {'prcp': pd.Series(prcpSeries),
     'tmax': pd.Series(tmaxSeries),
     'tmin': pd.Series(tminSeries),
     'ndvi': pd.Series(ndviSeries),
     'lstm': pd.Series(lstmSeries),
     'evtm': pd.Series(evtmSeries)}

df = pd.DataFrame(d)
outFile ='F:/data/output/run1/_'+str(i)+'.out'
df.to_csv(outFile, header = False, chunksize = 1000)
d = None
df = None
但是我的代码被困在下面的行中,给出了一个内存错误

df = pd.DataFrame(d)

有什么建议吗?是否可以逐块填充Pandas数据帧?

如果您知道每个数据帧的长度相同,则可以直接从数组创建数据帧,然后追加每个列:

df = pd.DataFrame(prcpSeries, columns=['prcp'])
df['tmax'] = tmaxSeries
...

注意:您也可以使用该方法(允许您(可选)传递名称-如果系列没有名称,这将非常有用):


但是,如果它们是可变长度的,则会丢失一些数据(任何长于
prcpSeries
的数组)。这里的另一种方法是创建每个数据帧,然后执行外部联接(使用):

例如:

In [21]: dfA = pd.DataFrame([1,2], columns=['A'])

In [22]: dfB = pd.DataFrame([1], columns=['B'])

In [23]: pd.concat([dfA, dfB], join='outer', axis=1)
Out[23]:
   A   B
0  1   1
1  2 NaN

你能从一个列中创建一个数据帧吗:pd.DataFrane({'tmax':pd.Series(tmaxSeries)})?用第一个序列创建一个帧,并按顺序添加它们,例如,
df=DataFrame({'prcp':pd.Series(prcpSeries)});df['tmax']=pd.Series(tmaxSeries)
。无论如何,您都应该将其写入HDF5,请参阅:@Jeff我想知道这是否可行,但不确定如何测试它。。。(need;))当您传递dict时(即使值是一系列的),我认为是复制的。如果您以迭代方式执行(参数是一个系列),则不会copy@Jeff我拼凑了一些东西。。。我想我更喜欢使用外海螺。谢谢安迪和杰夫!我必须使用第一种方法追加每一列,因为第二种方法在df=pd.concat(等)行中得到一个内存错误。我知道长度最长的序列,并将使用该序列初始化数据帧。一个警告:我使用的是pandas版本0.14.1,当我尝试将序列对象强制为数据帧对象时,如果我在
pandas.DataFrame()
调用中指定
columns=['my_column_name']
,则生成的对象是空数据帧。当我删除columns参数时,得到的数据帧与预期的一样。@Jubbles感谢您提到这一点,也许在这里使用
to_frame
方法更干净(我不确定在编写原始答案时是否可用)-我已更新了此答案以提及这一点。我会看看这在0.14+中是否不再有效,稍后我会进行检查。
df1 = pd.DataFrame(prcpSeries, columns=['prcp'])
df2 = pd.DataFrame(tmaxSeries, columns=['tmax'])
...

df = pd.concat([df1, df2, ...], join='outer', axis=1)
In [21]: dfA = pd.DataFrame([1,2], columns=['A'])

In [22]: dfB = pd.DataFrame([1], columns=['B'])

In [23]: pd.concat([dfA, dfB], join='outer', axis=1)
Out[23]:
   A   B
0  1   1
1  2 NaN