从文本文件读取数据并将其分配到数据框中的最快方法是什么?

7
我希望通过读取文本文件创建一个多索引DataFrame。使用df.loc[[],[]]从文本文件分配数据到多索引中,然后创建多索引是否更快呢?还是将行连接到DataFrame并在最后设置DataFrame的索引更快呢?或者,使用列表或dict存储从文件读取的数据,然后从它们创建一个DataFrame是否更快呢?是否有更pythonic或更快的选项?
示例文本文件:
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日: 这与如何使用Python解析复杂文本文件?有关。我还写了一篇博客文章,向初学者解释如何解析复杂文件。


也许你可以使用timeit模块来测试它。 - juanpa.arrivillaga
文本文件有多大? - Martin Evans
@MartinEvans 100 MB的顺序 - bluprince13
2个回答

8

在pandas中逐个元素查找是一项昂贵的操作,按索引对齐也是如此。我建议将所有内容读入数组中,创建值的数据框,然后直接设置分层索引。如果您可以避免追加或查找,通常会更快。

假设您有一个将所有内容都合并在一起的数据集2D数组,这里是一个示例结果:

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

5

解析文本文件将占据大部分处理开销。

如果速度是主要问题,建议使用pickle或shelve将DataFrame对象存储在二进制文件中以备使用。

如果您需要出于任何原因使用文本文件,则可以编写单独的模块来在不同格式之间进行转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接