Ana*_*ory 5 python csv tail pandas
在pandas中,我可以pandas.io.parser.read_csv("file.csv", nrows=10000)用来获取csv文件的前10000行.
但是因为我的csv文件很大,并且最后一行比第一行更有意义,所以我想阅读最后10000行.但是,即使我知道文件的长度,这也不是那么容易,因为如果我使用pandas.io.parser.read_csv("file.csv", nrows=10000, skiprows=990000)包含文件头的第一行跳过1000000行csv文件的前990000行,也会被跳过.(header=0在skiprows应用之后进行测量,因此它也没有帮助.)
如何从第0行中带有标题的csv文件中获取最后10000行,最好不知道行中文件的长度?
您可以先使用以下方法计算文件大小:
size = sum(1 for l in open('file.csv'))
Run Code Online (Sandbox Code Playgroud)
然后使用skiprows具有range:
df = pd.read_csv('file.csv', skiprows=range(1, size - 10000))
Run Code Online (Sandbox Code Playgroud)
编辑
正如@ivan_pozdeev提到的解决方案,你需要通过文件两次.我试图用pandas读取整个文件,然后使用tail方法,但这个方法比较慢,然后建议.
示例数据帧:
pd.DataFrame(np.random.randn(1000000,3), columns=list('abc')).to_csv('file.csv')
Run Code Online (Sandbox Code Playgroud)
定时
def f1():
size = sum(1 for l in open('file.csv'))
return pd.read_csv('file.csv', skiprows=range(1, size - 10000))
def f2():
return pd.read_csv('file.csv').tail(10000)
In [10]: %timeit f1()
1 loop, best of 3: 1.8 s per loop
In [11]: %timeit f2()
1 loop, best of 3: 1.94 s per loop
Run Code Online (Sandbox Code Playgroud)