向量化 Pandas 数据帧

Posted

技术标签:

【中文标题】向量化 Pandas 数据帧【英文标题】:vectorizing Pandas dataframes 【发布时间】:2020-05-05 18:22:22 【问题描述】:

这是一个数据清理练习,其中数据帧 A 的特定元素应设置为 NaN,具体取决于通过 B 解码的值。

我编写了以下代码,其中 3 嵌套循环将运行 17 小时:

def Convert(input):
    X = np.fromstring(input[1:-1], dtype=np.int, sep=',')
    return X
tf = B
# B is a dataframe of descriptors for the A dataframe
# the column 'missing_or_unknown' in B is used to determine the elements of A to be replaced
tf['missing_or_unknown'] = B['missing_or_unknown'].apply(lambda x: Convert(x))
Y = tf['missing_or_unknown'].values
for i in range(0,len(A)):
    for j in range(0,85):
        for k in range (0,len(Y[j])):
            if A.iloc[i,j] == Y[j][k]:
                A[i,j] = np.nan

我怀疑瓶颈是长外循环,因为len(A) 大约是 100 万。所以,这不是使用 Pandas 的最佳方式,我会选择:

for j in range(0,85):
      for k in range (0,len(Y[j])):
        if A.iloc[:,j] == Y[j][k]:
                A.iloc[:,j] = np.nan

然而后者抛出异常:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

2 个问题:

    我对向量化的性能瓶颈和好处说得对吗 如何正确表达if条件 Y 的计算并不昂贵,它是一个查找数组以确定如何操作 A 数据帧

【问题讨论】:

是的,几乎不需要循环遍历 DataFrame,当然也不需要 3 个嵌套循环。您要完成什么,仅在上下文之外查看嵌套循环非常难以理解.... 我在帖子中添加了更多细节 【参考方案1】:

如果你想用np.nan 替换任何A 的条目等于Y 的条目在相同的位置,你可以使用:

A[A==Y]=np.nan

这能解决您的问题吗?

您的第一个代码可以运行,但速度很慢。

您的第二个代码不起作用,因为 if 语句将整个列(系列A.iloc[:,j]与一个值进行比较,您可以按照建议使用.any()

在这里,我比较了我的代码在您第一次尝试两个尺寸为 100x85 的数据帧时的速度:

import time
A = pd.DataFrame(np.zeros([100,85]))
A.iloc[0,1] = 1
Y = pd.DataFrame(np.ones([100,85]))
start_time = time.time()
A[A==Y]=np.nan
print("--- %s seconds ---" % (time.time() - start_time))
--- 0.030421018600463867 seconds ---

start_time = time.time()
for i in range(0,len(A)):
for j in range(0,85):
    for k in range (0,len(Y[j])):
        if A.iloc[i,j] == Y[j][k]:
            A[i,j] = np.nan
print("--- %s seconds ---" % (time.time() - start_time))
--- 17.413578748703003 seconds ---

【讨论】:

我对上面提出的解决方案进行了快速测试;似乎没问题,只用了 20 分钟。惊人的。我不知道 Pandas 的这些可能性

以上是关于向量化 Pandas 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

向量化前瞻性函数 pandas 数据框

为 Scikit-Learn 向量化 Pandas 数据框

向量化 pandas.DataFrame 的集成

查看前一行值时用于循环优化(矢量化)的 Pandas

Pandas:向量化局部范围操作([i:i+2] 行的最大值和总和)

pandas数组(pandas Series)-向量化运算