pandas 中 csv 的条件行读取

2024-01-07

我有大型 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_csvchunksize指定参数后,可以使用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(使用前将#替换为@)

pandas 中 csv 的条件行读取 的相关文章

随机推荐