Python 使用熊猫创建带有序列的数据帧,导致内存错误
我正在使用熊猫图书馆进行遥感时间序列分析。最后,我想通过使用块大小将数据帧保存到csv,但我遇到了一个小问题。我的代码生成6个NumPy数组,并将其转换为Pandas系列。每个系列都包含许多项目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),
>>> 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