使用带有大表的循环的python性能问题

使用带有大表的循环的python性能问题,python,python-3.x,pandas,chained-assignment,Python,Python 3.x,Pandas,Chained Assignment,我正在使用python和pandas和scipy等多个库来准备数据,以便开始更深入的分析。例如,为了准备,我创建了两个日期不同的新列 我的代码提供了预期的结果,但速度非常慢,因此我无法将其用于具有80K行的表。对于这个简单的操作,表的运行时间大约需要80分钟 这个问题肯定与我的写作操作有关: tableContent[6]['p_test_Duration'].iloc[x] = difference 此外,python提供了一个警告: 日期差异的完整代码示例: 正确的结果表: 去掉循环,

我正在使用python和pandas和scipy等多个库来准备数据,以便开始更深入的分析。例如,为了准备,我创建了两个日期不同的新列
我的代码提供了预期的结果,但速度非常慢,因此我无法将其用于具有80K行的表。对于这个简单的操作,表的运行时间大约需要80分钟

这个问题肯定与我的写作操作有关:

tableContent[6]['p_test_Duration'].iloc[x] = difference

此外,python提供了一个警告:

日期差异的完整代码示例: 正确的结果表:

去掉循环,将函数应用于整个系列

ZEIT_ANFANG = tableContent[6]['p_test_ZEIT_ANFANG'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
ZEIT_ENDE = tableContent[6]['p_test_ZEIT_ENDE'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
tableContent[6]['p_test_Duration'] = ZEIT_ENDE - ZEIT_ANFANG

您可以使用
pd.to_datetime
对日期转换进行矢量化,并避免不必要地使用
apply

tableContent[6]['p_test_Duration'] = (
    pd.to_datetime(tableContent[6]['p_test_ZEIT_ENDE']) -
    pd.to_datetime(tableContent[6]['p_test_ZEIT_ANFANG'])
)

此外,由于链式索引辅助,您还收到了
设置WithCopy
警告

tableContent[6]['p_test_Duration'].iloc[x] = difference

如果你按照我建议的方式去做,你就不必担心这个问题。

其他答案也不错,但我建议你一般避免链式索引。pandas会记录,因为它要么产生不可靠的结果,要么速度慢(由于多次调用_getitem__)。假设数据帧是多索引的,则可以替换:

tableContent[6]['p_test_Duration'].iloc[x] = difference
与:


您有时可以绕过这个问题,但为什么不学习最不可能在将来引起问题的方法呢?

如果您使用pandas,为什么不使用pandas datetime?如果您可以添加示例输入,将更容易帮助您。非常感谢。它工作得很好!对您的代码只有一条评论:关闭.apply()方法缺少了两个括号。很高兴它起了作用,添加了缺少的括号,我不知道人们如何使用lisp括号;-)这个答案是更好的~为了效率目的不应该考虑<代码>应用< /代码>。
tableContent[6]['p_test_Duration'].iloc[x] = difference
tableContent.loc[x, (6, 'p_test_Duration')] = difference