我有大型 CSV,我只对行的子集感兴趣。特别是,我想读入在满足特定条件之前发生的所有行。
例如,如果read_csv
将产生数据框:
A B C
1 34 3.20 'b'
2 24 9.21 'b'
3 34 3.32 'c'
4 24 24.3 'c'
5 35 1.12 'a'
...
1e9 42 2.15 'd'
有没有办法读取 csv 中的所有行,直到 col B 超过 10。在上面的示例中,我想读入:
A B C
1 34 3.20 'b'
2 24 9.21 'b'
3 34 3.32 'c'
4 24 24.3 'c'
我知道如何在读入数据帧后将这些行扔掉,但此时我已经花费了所有计算来读入它们。在读取 csv 之前我无法访问最后一行的索引(不跳页脚 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html please)
您可以分块读取 csv。自从pd.read_csv
当chunksize
指定参数后,可以使用itertools.takewhile
仅读取所需数量的块,而不读取整个文件。
import itertools as IT
import pandas as pd
chunksize = 10 ** 5
chunks = pd.read_csv(filename, chunksize=chunksize, header=None)
chunks = IT.takewhile(lambda chunk: chunk['B'].iloc[-1] < 10, chunks)
df = pd.concat(chunks)
mask = df['B'] < 10
df = df.loc[mask]
或者,为了避免使用df.loc[mask]
要从最后一个块中删除不需要的行,也许一个更干净的解决方案是定义一个自定义生成器:
import itertools as IT
import pandas as pd
def valid(chunks):
for chunk in chunks:
mask = chunk['B'] < 10
if mask.all():
yield chunk
else:
yield chunk.loc[mask]
break
chunksize = 10 ** 5
chunks = pd.read_csv(filename, chunksize=chunksize, header=None)
df = pd.concat(valid(chunks))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)