来自 csv 的第一行和最后一行的 Python pandas DataFrame

新手上路,请多包涵

全部 -

我希望仅从非常大的 csv 的第一行和最后一行创建一个 pandas DataFrame。本练习的目的是能够轻松地从这些 csv 文件的第一个和最后一个条目中获取一些属性。我可以使用以下方式获取 csv 的第一行:

 pd.read_csv(filename, nrows=1)

我也可以通过各种方式获取文本文件的最后一行,例如:

 with open(filename) as f:
    last_line = f.readlines()[-1]

然而,将这两件事放到一个 DataFrame 中让我陷入了困境。对如何最好地实现这一目标有任何见解吗?

编辑注意:我试图在不首先将所有数据加载到单个 DataFrame 的情况下完成此任务,因为我正在处理相当大的(> 15MM 行)csv 文件。

谢谢!

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

阅读 1.3k
2 个回答

只需使用 headtailconcat 。您甚至可以调整行数。

 import pandas as pd

df = pd.read_csv("flu.csv")
top = df.head(1)
bottom = df.tail(1)
concatenated = pd.concat([top,bottom])

print concatenated

结果:

            Date  Cases
0      9/1/2014     45
121  12/31/2014     97

调整 headtail 从顶部开始5行,从底部开始10行……

            Date  Cases
0      9/1/2014     45
1      9/2/2014    104
2      9/3/2014     47
3      9/4/2014    108
4      9/5/2014     49
112  12/22/2014     30
113  12/23/2014     81
114  12/24/2014     99
115  12/25/2014     85
116  12/26/2014     55
117  12/27/2014     91
118  12/28/2014     68
119  12/29/2014    109
120  12/30/2014     55
121  12/31/2014     97

如果您不想将整个 CSV 文件作为数据帧加载,可以使用的一种可能方法是将它们单独作为 CSV 进行处理。以下代码类似于您的方法。

 import pandas as pd
import csv

top = pd.read_csv("flu.csv", nrows=1)
headers = top.columns.values

with open("flu.csv", "r") as f, open("flu2.csv","w") as g:
    last_line = f.readlines()[-1].strip().split(",")
    c = csv.writer(g)
    c.writerow(headers)
    c.writerow(last_line)

bottom = pd.read_csv("flu2.csv")
concatenated = pd.concat([top, bottom])
concatenated.reset_index(inplace=True, drop=True)

print concatenated

结果是一样的,除了索引。针对一百万行进行了测试,并在大约一秒钟内处理完毕。

         Date  Cases
0   9/1/2014     45
1  7/25/4885     99
[Finished in 0.9s]

它如何扩展到 1500 万行,也许这就是你现在的球赛。所以我决定针对正好 15,728,626 行对其进行测试,结果似乎足够好。

         Date  Cases
0   9/1/2014     45
1  7/25/4885     99
[Finished in 3.3s]

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

这是我找到的最佳解决方案

import pandas as pd

count=len(open(filename).readlines())

df=pd.read_csv(filename, skiprows=range(2,count-1), header=0)

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

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