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

Nip*_*tra 11 python csv numpy pandas

一些方法可以做到这一点:

  1. 阅读整个CSV然后使用 df.tail
  2. 以某种方式反转文件(对于大文件最好的方法是什么?)然后使用nrows参数来读取
  3. 以某种方式找到CSV中的行数,然后使用skiprows并读取所需的行数.
  4. 也许做块读取丢弃初始块(虽然不知道这将如何工作)

可以用更简单的方式完成吗?如果不是,应该优先考虑这三者中的哪一个?为什么?

可能相关:

  1. 有效地找到文本文件中的最后一行
  2. 使用pandas read_csv和nrows读取~13000行CSV文件的部分内容

没有直接关系:

  1. 如何获得最后一行pandas数据帧?

And*_*den 21

我不认为大熊猫提供了这样做的方法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)
Run Code Online (Sandbox Code Playgroud)

另一个值得尝试的选择是在第一遍中获取行数然后再次读取文件,使用read_csv... 跳过该行数(减去n)


Par*_*nde 10

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

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)
Run Code Online (Sandbox Code Playgroud)


che*_*ner 6

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

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

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


小智 5

第三个选项是我使用的:

以某种方式找到 CSV 中的行数,然后使用跳行并读取所需的行数。

这是我的建议:

import pandas as pd 

# User inputs
fname = 'test_file.csv'
tail_len = 15

# The two steps in the description
n_rows = sum(1 for row in open(fname, 'r'))
df = pd.read_csv(fname, skiprows=range(1, n_rows - tail_len))
Run Code Online (Sandbox Code Playgroud)

关于“以某种方式”,我从这里得到了这个想法。


归档时间:

查看次数:

10030 次

最近记录:

7 年,2 月 前