Python从csv的第一行和最后一行复制数据帧
所有- 我希望只从非常大的csv的第一行和最后一行创建熊猫数据帧。本练习的目的是能够轻松地从这些csv文件的第一个和最后一个条目中获取一些属性。我可以通过以下方式获取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] 然而,将这两件事放在一个数据帧中让我陷入了一个循环。对如何最好地实现这一目标有
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。否则,熊猫会将该行视为标题。(…或取前两行和最后一行…)