【问题标题】:Applying Conditions on Pandas DataFrame Columns before reading csv or tsv files在读取 csv 或 tsv 文件之前对 Pandas DataFrame 列应用条件
【发布时间】:2017-01-14 00:44:51
【问题描述】:

如果我已经知道列名和类型,是否可以在读取 csv 或 tsv 文件之前为 DataFrame 列设置条件(过滤器)?如果是,怎么做?

例如:考虑在一个非常大的文件中有两个数字列(col1 和 col2)。我不想将整个文件加载到内存中,并且只选择 col1 大于 col2 的那些行。因此,首先,我想在数据帧上设置条件,它应该只从 csv 文件中读取 col1 大于 col2 的那些行。我希望我的解释有意义。

谢谢

【问题讨论】:

  • 你的问题太模糊了,因为它取决于过滤涉及的内容,发布具有代表性的数据样本和所需的输出
  • 什么类型的过滤器?我不相信你可以在 Pandas 中读取数据时过滤数据。您需要使用 CSV 阅读器,在读取每一行时过滤数据,然后从过滤后的行创建一个数据框。
  • @EdChum。考虑在一个非常大的文件中有两个数字列(col1 和 col2)。我不想将整个文件加载到内存中,并且只选择 col1 大于 col2 的那些行。因此,首先,我想在数据帧上设置条件,它应该只读取 col1 大于 col2 的那些行。我希望我的解释有意义
  • 请根据您更新后的要求使用新的更新详细信息编辑您的问题,是的,可以做到。你能展示你的努力吗
  • @EdChum 我的代码正在逐块读取文件 (pandas-docs.github.io/pandas-docs-travis/…) 并应用条件。然而,这不是我想要的。

标签: python pandas dataframe conditional-statements


【解决方案1】:

您可以为此使用blaze,这是与pandas 一起使用的便捷工具。

假设输入文件为:

a,b
1,2
3,4
5,3
3,6
6,1

然后我们打开文件并查询数据 - 请注意,在您尝试实现/访问它之前不会执行查询:

import blaze
import pandas as pd

csv_data = blaze.Data('input.csv')
query = csv_data[csv_data['a'] > csv_data['b']]
df = pd.DataFrame.from_records(query, columns=query.fields)

然后将df 设为:

   a  b
0  5  3
1  6  1

【讨论】:

  • 不会将整个 csv 数据加载到内存中吗?
  • @Manu nope - 它将通过查询的行加载到内存中,并且它只是作为 DataFrame 构造的一部分......
  • 截至今天,Blaze 不再与 Pandas 兼容,因为 Pandas 将 pd.tslib.NaTType 更改为 type(pd.NaT)。它已在#546 中进行了修补,但似乎没有人在新版本中包含该修补程序。构建和文档已经中断了几个月,表明开发已经停滞。有没有 Blaze 的替代品?
猜你喜欢
  • 2013-06-17
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多