我有一个简单/平面的数据集,看起来像
columnA columnB columnC
value1a value1b value1c
value2a value2b value2c
...
valueNa valueNb valueNc
虽然结构很简单,但它有几千万行深,我有50多列
我需要验证行中的每个值是否符合某些格式要求。有些检查很简单(例如isDecimal
、isEmpty
、isAllowedValue
等),但有些检查涉及对其他列的引用(例如columnC
=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函数处理列。事实上,熊猫将数据列主存储在内存中。因此,逐行访问需要从内存中提取和聚合来自许多不同位置的数据矢量化不可能或很难有效实现(因为大多数硬件本身无法将其矢量化)。此外,Python循环通常非常慢(如果使用主流的CPython解释器)
您可以直接使用Pandas或Numpy处理列。请注意,如果使用定义良好的本机类型(float、小整数和有界字符串,而不是像无界字符串和大整数这样的Python对象),Numpy操作要快得多。还要注意,Pandas已经在内部使用Numpy存储数据
以下是一个例子:
另一种方法是将数据集分割成更小的部分并并行计算。 对于验证部分、类型或模式,我建议使用voluptuous或其他库,我发现一种模式非常易于维护。 总之,正如@jerome所说,向量方法可以节省大量计算时间
相关问题 更多 >
编程相关推荐