wrc*_*obb 3 python csv dataframe pandas
全部 -
我期待从一个非常大的csv的第一行和最后一行创建一个pandas DataFrame.本练习的目的是能够轻松地从这些csv文件中的第一个和最后一个条目中获取一些属性.我使用以下方法抓住csv的第一行没有问题:
pd.read_csv(filename, nrows=1)
Run Code Online (Sandbox Code Playgroud)
我也可以通过各种方式抓取文本文件的最后一行,例如:
with open(filename) as f:
last_line = f.readlines()[-1]
Run Code Online (Sandbox Code Playgroud)
但是,将这两个东西放到一个DataFrame中会让我感到厌恶.有关如何最好地实现这一目标的任何见解?
编辑注意:我正在尝试完成此任务,而不是首先将所有数据加载到单个DataFrame中,因为我正在处理相当大(> 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
Run Code Online (Sandbox Code Playgroud)
结果:
Date Cases
0 9/1/2014 45
121 12/31/2014 97
Run Code Online (Sandbox Code Playgroud)
调整head并tail从顶部取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
Run Code Online (Sandbox Code Playgroud)
如果您不想将整个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
Run Code Online (Sandbox Code Playgroud)
除索引外,结果相同.测试了一百万行,并在大约一秒钟内处理.
Date Cases
0 9/1/2014 45
1 7/25/4885 99
[Finished in 0.9s]
Run Code Online (Sandbox Code Playgroud)
它如何扩展到1500万行,也许这就是你现在的球赛.
所以我决定对15,728,626行进行测试,结果看起来不错.
Date Cases
0 9/1/2014 45
1 7/25/4885 99
[Finished in 3.3s]
Run Code Online (Sandbox Code Playgroud)
这是我找到的最好的解决方案
import pandas as pd
count=len(open(filename).readlines())
df=pd.read_csv(filename, skiprows=range(2,count-1), header=0)
Run Code Online (Sandbox Code Playgroud)
因此,在不首先将整个文件读入 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))
Run Code Online (Sandbox Code Playgroud)