大熊猫中 csv 的条件行读取

新手上路,请多包涵

我有大型 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 之前我无法访问最后一行的索引(请不要 跳脚

原文由 eretmochelys 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 446
2 个回答

您可以分块读取 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))

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

基于@joanwa 的回答:

 df = (pd.read_csv("filename.csv")
      [lambda x: x['B'] > 10])


来自 Wes McKinney 的“Python for Data Analysis”一章关于“Advanced pandas”的内容:

在将它分配给临时变量 df 之前,我们不能引用 load_data 的结果。为了解决这个问题,assign 和许多其他 pandas 函数接受类似函数的参数,也称为可调用对象。

要显示实际的可调用对象,请考虑…

 df = load_data()
df2 = df[df['col2'] < 0]

可以重写为:

 df = (load_data()
      [lambda x: x['col2'] < 0])

原文由 rdmolony 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题