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

时间:2014-11-07 17:19:19

标签: python csv 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文件。

谢谢!

4 个答案:

答案 0 :(得分:6)

只需使用headtail以及concat即可。您甚至可以调整行数。

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]

答案 1 :(得分:3)

因此,在没有将整个文件读入Python的情况下首先执行此操作的方法是获取第一行,然后遍历文件到最后一行。然后使用StringIO将它们吸入Pandas。也许是这样的:

import pandas as pd
import StringIO

with open('tst.csv') as f:
    first_line = f.readline()
    for line in f:
        pass #iterate to the end
    last_line = line

mydf = pd.DataFrame()
mydf = mydf.append(pd.read_csv(StringIO.StringIO(first_line), header=None))
mydf = mydf.append(pd.read_csv(StringIO.StringIO(last_line), header=None))

答案 2 :(得分:2)

你想要这个答案https://stackoverflow.com/a/18603065/4226476 - 不是接受的答案,而是最好的答案,因为它会向后寻找第一个换行而不是猜测。

然后将两行包装在StringIO中:

from cStringIO import StringIO
import pandas as pd

# grab the lines as per first-and-last-line question
truncated_input = StringIO(the_two_lines)
truncated_input.seek(0) # need to rewind
df = pd.read_csv(truncated_input)

答案 3 :(得分:1)

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

import pandas as pd

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

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