在 python 中迭代列表和添加熊猫数据框列非常慢

Posted

技术标签:

【中文标题】在 python 中迭代列表和添加熊猫数据框列非常慢【英文标题】:Iterating over list and adding panda dataframe columns is incredibly slow in python 【发布时间】:2021-07-27 05:37:56 【问题描述】:

我正在尝试迭代一个大列表,以便我可以更新数据框中的一些值。然而,结果是它太慢了,使得这段代码在生产环境中无法使用。我尝试了很多替代方案,但无法找到解决问题的好方法。

初始代码示例:

df = pd.DataFrame("A": [1], "B": [2], "C": [3])
list = ["D", "E", "F"]

for x in list:
    if x not in df:
        df[x] = 0

print(df)
"A": 1, "B": 2, "C": 3, "D": 0, "E": 0, "F": 0

我的性能测试显示列表中大约 3k 项的总时间为几秒钟。知道如何加快速度吗?

编辑:

我从循环遍历列表切换到直接向 df 添加新列。现在我正在创建我要添加的列的有序字典。然后我把它变成 df2 并附加到 df.我不会将其标记为完成,因为我确信还有更快的方法。

更新代码示例:

dict = 
for x in list:
    if x not in df:
        dict[x] = 0

df2 = pd.DataFrame(dict, index=[0])
df = df.append(df2)

【问题讨论】:

您能否编辑问题并将样本(小)输入数据和预期输出放在那里? 好吧,怎么样? df = pd.DataFrame("A": 1, "B": 2, "C": 3) 抛出错误。这是正确的代码吗? 不,这只是示例代码。我无法发布我的实际代码,它使用 excel 文件和大量字符串作为其数据源。 你能制作出working最小的例子吗?该示例不必包含原始数据,而是我们可以粘贴和使用的数据。 【参考方案1】:

您可以尝试使用timeit 测试不同的方法。

这是一个例子:

#!/usr/bin/env python

import timeit

test_one_setup = '''
import pandas as pd
'''

test_one = '''
df = pd.DataFrame("A": 1, "B": 2, "C": 3, index=[0])
l = ["A", "C", "D"]
for x in l:
    if x not in df:
        df[x] = 0
#
#    A  B  C  D
# 0  1  2  3  0
#
'''

print (timeit.timeit(setup = test_one_setup,
                     stmt = test_one,
                     number = 1000)) 

test_two_setup = '''
import pandas as pd
'''

test_two = '''
df = pd.DataFrame("A": 1, "B": 2, "C": 3, index=[0])
l = ["A", "C", "D"]
df2 = df.apply(lambda x:[0] if x.name in l else x)
#
#    A  B  C
# 0  0  2  0
#
'''

print (timeit.timeit(setup = test_two_setup,
                     stmt = test_two,
                     number = 1000))

我对您的示例代码仍然有些不清楚,因为您作为输出提供的变异数据框与我从您的代码中得到的并不完全一致。

您可能希望查看问题中的代码,并提供一个最小的工作示例,清楚地展示您的输入是什么、您的逻辑是什么、您期望什么输出。然后编辑您的问题以反映您真正想要做的事情。

无论如何,希望这有助于性能测试。

【讨论】:

以上是关于在 python 中迭代列表和添加熊猫数据框列非常慢的主要内容,如果未能解决你的问题,请参考以下文章

如何迭代熊猫数据框列中的元素?

数据框列数据 - 熊猫 - python

PySpark - 将列表作为参数传递给 UDF + 迭代数据框列添加

从列表列表中提取元素并将其分配为熊猫数据框列中的值

使用熊猫在数据框列中添加缺失时间

熊猫数据框列上的子字符串