高效地将 CSV 的最后“n”行读入 DataFrame

新手上路,请多包涵

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

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

可以用更简单的方法完成吗?如果不是,应该首选这三者中的哪一个,为什么?

可能相关:

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

无直接关系:

  1. 如何获取 pandas 数据框的最后 n 行?

原文由 Nipun Batra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我不认为 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)

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

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 import tailer
import pandas as pd
import io

with open(filename) as file:
    last_lines = tailer.tail(file, 15)

df = pd.read_csv(io.StringIO('\n'.join(last_lines)), header=None)

您需要安装 tailer 才能正常工作:

 pip install --user tailer

原文由 Parikshit Bhinde 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题