python - python中大型数据集的高效条件验证

标签 python performance validation

我有一个简单/扁平的数据集,看起来像......

columnA columnB columnC
value1a value1b value1c
value2a value2b value2c
...
valueNa valueNb valueNc

虽然结构很简单,但它有数千万行深,而且我有 50 多列。

我需要验证一行中的每个值是否符合特定的格式要求。有些检查很简单(例如 isDecimalisEmptyisAllowedValue 等),但有些涉及对其他列的引用(例如 columnC code> = columnA/columnB),有些涉及条件验证(例如,如果 columnC = x,则 columnB 包含 y)。

我开始认为验证此数据的最有效方法是将 lambda 函数应用于我的数据框......

df.apply(lambda x: validateCol(x), axis=1)

但这似乎无法支持我需要执行的全部条件验证(其中特定单元格验证需要引用其他列中的其他单元格)。

最有效的方法是简单地逐一循环所有行并逐一检查每个单元格吗?目前,我正在诉诸此方法,但需要几分钟才能浏览列表......

df.columns = ['columnA','columnB','columnC']
myList = df.T.to_dict().values() #much faster to iterate over list
for row in myList:
    #validate(row['columnA'], row['columnB'], row['columnC'])

感谢您对最有效的方法的任何想法。目前,我的解决方案有效,但感觉丑陋且缓慢!

最佳答案

迭代行的效率非常低。您应该直接使用矢量化函数或 Pandas 函数处理列。事实上,Pandas 在内存中存储列主数据。因此,逐行访问需要从内存中提取和聚合来自许多不同位置的数据。 矢量化不可能或难以有效实现(因为大多数硬件本身无法对其进行矢量化)。而且,Python循环通常非常慢(如果您使用主流的 CPython 解释器)。

您可以直接使用 Pandas 或 Numpy 处理列。请注意,如果您使用定义良好的 native 类型(浮点型、小整数和有界字符串,而不是无界字符串和大整数等 Python 对象),Numpy 操作会快得多。另请注意,Pandas 已在内部使用 Numpy 存储数据。

这是一个例子:

import pandas as pd
import numpy as np

df = pd.DataFrame({'columnA':[1, 4, 5, 7, 8], 'columnB':[4, 7, 3, 6, 9], 'columnC':[5, 8, 6, 1, 2]})

a = df['columnA'].to_numpy()
b = df['columnB'].to_numpy()
c = df['columnC'].to_numpy()

# You can use np.isclose for a row-by-row result stored into an array
print(np.allclose(a/b, c))

关于python - python中大型数据集的高效条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66865389/

相关文章:

c# - Fluent Validation,在 Asp.NET Core 中对列表中的每个项目进行不同的验证

javascript - 使用正则表达式出现无效量词错误(英国电话号码)

python - 在 Python 和 MySQL 的存储过程中使用变量

python - 在 python 字典或数据框中查找共现

python - 在 python 中加速 int 列表到二进制的转换

javascript - EmberJS 和 Rails 4 API 的性能问题

java - 在 Java 中生成随机股票行情的最有效方法?

java - 如何根据单选按钮组件的值验证输入文本组件

python - 如何查询 PostgreSQL 中的写重表?

python - 值相等时的 numpy argmax