高效地将最后'n'行CSV读入DataFrame

时间:2013-06-14 12:14:12

标签: python csv numpy pandas

有几种方法可以做到这一点:

  1. 阅读整个CSV,然后使用df.tail
  2. 以某种方式反转文件(对于大文件最好的方法是什么?)然后使用nrows参数来阅读
  3. 以某种方式找到CSV中的行数,然后使用skiprows并读取所需的行数。
  4. 也许做块读取丢弃初始块(虽然不确定这是如何工作的)
  5. 可以用更简单的方式完成吗?如果不是,应该优先选择这三者中的哪一个?为什么?

    可能相关:

    1. Efficiently finding the last line in a text file
    2. Reading parts of ~13000 row CSV file with pandas read_csv and nrows
    3. 没有直接关系:

      1. How to get the last n row of pandas dataframe?

4 个答案:

答案 0 :(得分:19)

我认为pandas不会在read_csv中提供一种方法。

也许最好的(一次通过)是使用collections.deque

from collections import deque
from StringIO import StringIO

with open(fname, 'r') as f:
    q = deque(f, 2)  # replace 2 with n (lines read at the end)

In [12]: q
Out[12]: deque(['7,8,9\n', '10,11,12'], maxlen=2)
         # these are the last two lines of my csv

In [13]: pd.read_csv(StringIO(''.join(q)), header=None)

值得尝试的另一个选择是get the number of lines in a first pass,然后再次读取文件,使用read_csv跳过该行数(减去n)...

答案 1 :(得分:6)

文件只是字节流。线不作为单独的实体存在;它们是将某些字节视为换行符的工件。因此,必须从文件的开头读取以按顺序标识行。

如果文件没有经常更改并且这是您需要经常执行的操作(例如,使用n的不同值),则可以在一秒钟内存储换行符的字节偏移量文件。您可以使用这个小得多的文件和seek命令快速跳转到第一个文件中的给定行并从那里读取。

(某些操作系统提供面向记录的文件,其内部结构比普通平面文件更复杂。以上内容不适用于它们。)

答案 2 :(得分:3)

这是一个方便的方法。适合我喜欢做的事情 -

import tailer as tl
import pandas as pd
import io
file = open(fname)
lastLines = tl.tail(file,15) #to read last 15 lines, change it  to any value.
file.close()
df=pd.read_csv(io.StringIO('\n'.join(lastLines)), header=None)

答案 3 :(得分:0)

由于您正在考虑反转文件,因此我认为可以创建新文件。

  1. 使用最后n行创建一个新文件。 tail -n original.csv > temp.csv
  2. 将标题行添加到临时文件并生成新文件。 head -1 original.csv | cat - temp.csv > newfile.csv && rm -f temp.csv