Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从csv的第一行和最后一行复制数据帧_Python_Csv_Pandas_Dataframe - Fatal编程技术网

Python从csv的第一行和最后一行复制数据帧

Python从csv的第一行和最后一行复制数据帧,python,csv,pandas,dataframe,Python,Csv,Pandas,Dataframe,所有- 我希望只从非常大的csv的第一行和最后一行创建熊猫数据帧。本练习的目的是能够轻松地从这些csv文件的第一个和最后一个条目中获取一些属性。我可以通过以下方式获取csv的第一行: pd.read_csv(filename, nrows=1) 我还可以通过各种方式抓取文本文件的最后一行,例如: with open(filename) as f: last_line = f.readlines()[-1] 然而,将这两件事放在一个数据帧中让我陷入了一个循环。对如何最好地实现这一目标有

所有-

我希望只从非常大的csv的第一行和最后一行创建熊猫数据帧。本练习的目的是能够轻松地从这些csv文件的第一个和最后一个条目中获取一些属性。我可以通过以下方式获取csv的第一行:

pd.read_csv(filename, nrows=1)
我还可以通过各种方式抓取文本文件的最后一行,例如:

with open(filename) as f:
    last_line = f.readlines()[-1]
然而,将这两件事放在一个数据帧中让我陷入了一个循环。对如何最好地实现这一目标有何见解

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


谢谢

只需使用
head
tail
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
调整
头部
尾部
以从顶部分为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万排相比,它的规模有多大,也许这就是你的球赛了。 所以我决定对15728626行进行测试,结果似乎足够好了

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

因此,在不首先将整个文件读入Python的情况下执行此操作的方法是获取第一行,然后遍历文件直到最后一行。然后用StringIO把它们吸进熊猫体内。也许是这样的:

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))
你想要这个答案——不是被接受的答案,而是最好的答案,因为它向后寻找第一条换行,而不是猜测

然后将这两行代码用StringIO包起来:

从cStringIO导入StringIO
作为pd进口熊猫
#根据第一行和最后一行问题抓取行
截断的输入=字符串IO(两行)
截断的_输入。查找(0)#需要倒带
df=pd.read\u csv(截断的\u输入)

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

import pandas as pd

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

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

你能展示一下你在把这两件事放到一个数据框中所采取的步骤吗?你有什么错误got@Anzel第一个代码段成功捕获第一行并将其放入数据帧中。第二个代码段获取最后一行,但它缺少标题,因此我无法创建新的数据帧并使用简单的连接进行组合。行数是常量还是变化?如果知道行数,可以读取第一行,然后进行另一次读取,使用skiprows=n读取最后一行。然后pd.concat()将它们组合在一起。可能的缺点是您仍然必须解决标题问题和可能的str-int串联问题。@wrcobb:如果它能够扩展到您的要求,请参阅我上面的编辑。无可否认,我有点惊讶,这比提前知道计数和使用
skiprows
更快。看起来有时候回到旧的标准库模块真的很好。祝你好运我想你需要一个read_csv上的header=None。否则,熊猫会将该行视为标题。(…或取前两行和最后一行…)