从文本文件中读取数据并将其分配给数据框的最快方法是啥?
Posted
技术标签:
【中文标题】从文本文件中读取数据并将其分配给数据框的最快方法是啥?【英文标题】:What's the fastest way of reading data from a text file and allocating it to a data frame?从文本文件中读取数据并将其分配给数据框的最快方法是什么? 【发布时间】:2017-08-07 08:31:09 【问题描述】:我想通过读取文本文件来创建多索引DataFrame
。创建多索引然后使用df.loc[[],[]]
从文本文件中为其分配数据,或者将行连接到DataFrame
并在最后设置DataFrame
的索引是否更快?或者,使用列表或dict
存储从文件中读取的数据,然后从它们创建DataFrame
是否更快?有没有更 Python 或更快的选择?
示例文本文件:
A = 1
B = 1
C data
0 1
1 2
A = 1
B = 2
C data
1 3
2 4
A = 2
B = 1
C data
0 5
2 6
输出数据帧:
A B C data
1 1 0 1
1 2
1 2 1 3
2 4
2 1 0 5
2 6
1 月 18 日更新:这是链接到How to parse complex text files using Python? 我还写了一个blog article explaining how to parse complex files to beginners。
【问题讨论】:
也许你可以使用timeit
模块来测试一下。
文本文件有多大?
@MartinEvans 订购 100 MB
【参考方案1】:
pandas 中逐元素查找是一项昂贵的操作,按索引对齐也是如此。我会将所有内容读入数组,创建值的 DataFrame,然后直接设置层次索引。如果您可以避免追加或查找,通常会更快。
这是一个示例结果,假设您有一个数据集二维数组,其中包含所有内容:
In [106]: dataset
Out[106]:
array([[1, 1, 0, 1],
[1, 1, 1, 2],
[1, 2, 1, 3],
[1, 2, 2, 4],
[2, 1, 0, 5],
[2, 1, 2, 6]])
In [107]: pd.DataFrame(dataset,columns=['A','B','C', 'data']).set_index(['A', 'B', 'C'])
...:
Out[107]:
data
A B C
1 1 0 1
1 2
2 1 3
2 4
2 1 0 5
2 6
In [108]: data_values = dataset[:, 3]
...: data_index = pd.MultiIndex.from_arrays( dataset[:,:3].T, names=list('ABC'))
...: pd.DataFrame(data_values, columns=['data'], index=data_index)
...:
Out[108]:
data
A B C
1 1 0 1
1 2
2 1 3
2 4
2 1 0 5
2 6
In [109]: %timeit pd.DataFrame(dataset,columns=['A','B','C', 'data']).set_index(['A', 'B', 'C'])
%%timeit
1000 loops, best of 3: 1.75 ms per loop
In [110]: %%timeit
...: data_values = dataset[:, 3]
...: data_index = pd.MultiIndex.from_arrays( dataset[:,:3].T, names=list('ABC'))
...: pd.DataFrame(data_values, columns=['data'], index=data_index)
...:
1000 loops, best of 3: 642 µs per loop
【讨论】:
【参考方案2】:解析文本文件将是您的大部分处理开销。
如果速度是主要考虑因素,我建议使用 pickle 或 shelve 将 DataFrame 对象存储在准备使用的二进制文件中。
如果您出于任何原因需要使用文本文件,可以编写一个单独的模块来进行格式之间的转换。
【讨论】:
以上是关于从文本文件中读取数据并将其分配给数据框的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何从文本框中获取值并将其分配给 Xcode 中的整数变量?
从.txt文件复制文本并将其分配给Python中的变量[重复]
Ant 脚本 - 如何从 plist 文件中打印一些文本并将其分配给属性