从大型元组/行列表中有效地构建 Pandas DataFrame

Posted

技术标签:

【中文标题】从大型元组/行列表中有效地构建 Pandas DataFrame【英文标题】:Efficiently construct Pandas DataFrame from large list of tuples/rows 【发布时间】:2012-07-10 01:41:23 【问题描述】:

我继承了一个以 Stata .dta 格式保存的数据文件。我可以使用 scikits.statsmodels genfromdta() 函数加载它。这会将我的数据放入一维 NumPy 数组中,其中每个条目是一行数据,存储在 24 元组中。

In [2]: st_time = time.time(); initialload = sm.iolib.genfromdta("/home/myfile.dta"); ed_time = time.time(); print (ed_time - st_time)
666.523324013

In [3]: type(initialload)
Out[3]: numpy.ndarray

In [4]: initialload.shape
Out[4]: (4809584,)

In [5]: initialload[0]
Out[5]: (19901130.0, 289.0, 1990.0, 12.0, 19901231.0, 18.0, 40301000.0, 'GB', 18242.0, -2.368063, 1.0, 1.7783716290878204, 4379.355, 66.17669677734375, -999.0, -999.0, -0.60000002, -999.0, -999.0, -999.0, -999.0, -999.0, 0.2, 371.0)

我很好奇是否有一种有效的方法可以将其安排到 Pandas DataFrame 中。根据我的阅读,逐行构建 DataFrame 似乎效率很低……但我有什么选择?

我已经写了一个非常慢的第一次通过,它只是将每个元组作为单行 DataFrame 读取并附加它。只是想知道是否还有其他更好的方法。

【问题讨论】:

pandas.DataFrame(initialload) 是否返回您正在搜索的内容? 哇。几乎。它弄乱了一些列名,但我可以很容易地解决这个问题。疯狂的。谢谢,即使在阅读了 Pandas 文档之后,我也永远不会猜到这一点。对不起,这太简单了。 【参考方案1】:
pandas.DataFrame(initialload, columns=list_of_column_names)

【讨论】:

【参考方案2】:

pandas 0.12 及以上版本应支持直接加载 Stata 格式 (Reference)。

来自文档:

***函数 read_stata 将读取一个 dta 格式文件并返回一个 DataFrame:StataReader 类将在初始化时读取给定 dta 文件的标头。它的方法 data() 将读取观察结果,将它们转换为返回的 DataFrame:

 pd.read_stata('stata.dta')

【讨论】:

以上是关于从大型元组/行列表中有效地构建 Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中有效地逐步过滤大型数据集

从 Sqlite 表中选择行的元组并有效地对元组进行排序

如何最好地将包含列表或元组的 Pandas 列提取到多个列中[重复]

pandas基于元组列表(list of tuples)列表词典(dictionary of lists)词典列表(list of dictionaries)构建dataframe数据实战

有效地附加到 pandas 数据帧

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用loc基于行层索引元组范围筛选dataframe数据(指定起始元组和结束元组)