【发布时间】:2019-09-02 22:14:31
【问题描述】:
我正在分析和总结一个数据集(“报告”)作为 Python pandas 数据框。该表显示了 4 个不同数据集(“Inputs”)之间的匹配过程的结果,这些数据集都应该在同一个键上匹配。
在 报告 中,每个 输入 都有一个字段,其中包含与基本数据集匹配数 (>=0) 的计数器。我想更新报告中的一个字段以指示有多少数据集与基本数据匹配(“matchCounter”),因此对于任意数量的成功匹配(即 >0), matchCounter 应该以 1 递增,最大为 4(即所有四个数据集都与基础数据匹配)。
我在 Jupyter 笔记本中使用大约 100,000 条记录的小型数据集开发了该过程,虽然我成功地更新了 matchCounter 字段,但我怀疑它花费的时间比预期的要长。完整的数据集是 10'000'000 条记录,根据我的粗略计算,我当前的代码需要 8 个多小时才能完成(我认为这是一个非常简单的操作)。
我已经阅读了一些关于提高数据帧性能的文章 (Pandas DataFrame performance),但是由于我是按顺序迭代行,并且 if 语句是在行中的项目而不是数据帧上测试的,我不知道这是否适用。
这是代码的摘要版本。第一个 for 循环是导致瓶颈的循环:
import numpy as np
import pandas as pd
df = pd.read_csv(fileIn, header=0)
df['match_count']= 0
df['exclude']= False
# This for loop takes 300+ seconds to execute 100'000 times
for index, row in df.iterrows():
matchCounter = 0
if row['in_deeds'] > 0:
matchCounter += 1
if row['in_valuation'] > 0:
matchCounter += 1
if row['in_property'] > 0:
matchCounter += 1
if row['in_sg'] > 0:
matchCounter += 1
df.loc[index,'match_count'] = matchCounter
# This for loop takes only 11.75 seconds
i=0
for index, row in df.iterrows():
if "EXCL" in row['stat_deeds'].upper():
i=i+1
df.loc[index,'exclude']=True
elif "EXCL" in row['stat_valuation'].upper():
i=i+1
df.loc[index,'exclude']=True
elif "EXCL" in row['stat_property'].upper():
i=i+1
df.loc[index,'exclude']=True
elif "EXCL" in row['stat_sg'].upper():
i=i+1
df.loc[index,'exclude']=True
df = df.query('exclude == False')
这是我第一次使用 Pandas,而且我也是 Python 的初学者,所以我认为我犯了一个愚蠢的错误。但我也不确定我的期望是否错误,这只是我应该期待的表现。有没有更好的办法?即使有人能指出我正确的方向,我也会很感激!
【问题讨论】:
标签: python pandas performance dataframe