11

我正在使用大约 3.3 GB 的 Stata .dta 文件,因此它很大但不会太大。我对使用 IPython 很感兴趣,并尝试使用 Pandas 导入 .dta 文件,但发生了一些奇怪的事情。我的盒子有 32 GB 的 RAM,尝试加载 .dta 文件会导致所有 RAM 都被使用(大约 30 分钟后),并且我的计算机停止运行。这并不“感觉”正确,因为我能够使用外部包中的 read.dta() 在 R 中打开文件没问题,并且在 Stata 中使用该文件很好。我正在使用的代码是:

%time myfile = pd.read_stata(data_dir + 'my_dta_file.dta')

我在 Enthought 的 Canopy 程序中使用 IPython。'%time' 的原因是因为我有兴趣将其与 R 的 read.dta() 进行基准测试。

我的问题是:

  1. 我做错了什么导致熊猫出现问题吗?
  2. 有没有办法将数据放入 Pandas 数据框中?
4

5 回答 5

8

这是一个对我来说很方便的小功能,它使用了pandas最初提出问题时可能不可用的一些功能:

def load_large_dta(fname):
    import sys

    reader = pd.read_stata(fname, iterator=True)
    df = pd.DataFrame()

    try:
        chunk = reader.get_chunk(100*1000)
        while len(chunk) > 0:
            df = df.append(chunk, ignore_index=True)
            chunk = reader.get_chunk(100*1000)
            print '.',
            sys.stdout.flush()
    except (StopIteration, KeyboardInterrupt):
        pass

    print '\nloaded {} rows'.format(len(df))

    return df

我用这个在 100 分钟内加载了一个 11G 的 Stata 文件,如果我厌倦了等待并点击cntl-c.

这本笔记本展示了它的实际应用

于 2015-08-07T04:33:38.187 回答
3

对于所有在此页面结束的人,请将 Pandas 升级到最新版本。在加载过程中,我遇到了一台停滞不前的计算机(300 MB Stata 文件,但只有 8 GB 系统内存),从 v0.14 升级到 v0.16.2 很快解决了这个问题。

目前,它是 v 0.16.2。尽管我不知道具体细节,但速度有了显着提高。请参阅:Stata 和 Python (Pandas) 之间最有效的 I/O 设置

于 2015-07-05T20:53:19.900 回答
3

有一种更简单的方法可以使用 Pandas 的内置函数来解决它read_stata

假设您的大文件名为large.dta.

import pandas as pd

reader=pd.read_stata("large.dta",chunksize=100000)

df = pd.DataFrame()

for itm in reader:
    df=df.append(itm)

df.to_csv("large.csv")
于 2018-10-27T15:45:35.137 回答
0

问题 1。

我对此无话可说。

问题2。

考虑将.dta 文件导出到.csv使用 Stata 命令outsheetexport delimited然后read_csv()在 pandas 中使用。实际上,您可以获取新创建的.csv文件,将其用作 R 的输入并与 pandas 进行比较(如果感兴趣的话)。read_csv可能进行了比 更多的测试read_stata

运行help outsheet以获取导出的详细信息。

于 2013-11-03T06:28:51.093 回答
-2

您不应该将 3GB 以上的文件读入内存数据对象,这是灾难的根源(与 pandas 无关)。正确的方法是对文件进行内存映射并根据需要访问数据。

您应该考虑将文件转换为更合适的格式(csvhdf),然后您可以使用 Pandas DataFrame 周围的Dask包装器根据需要对数据进行块加载:

from dask import dataframe as dd
# If you don't want to use all the columns, make a selection
columns = ['column1', 'column2']
data = dd.read_csv('your_file.csv', use_columns=columns)

这将透明地处理块加载、多核数据处理和所有这些东西。

于 2015-08-24T13:07:59.700 回答