【发布时间】: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 个嵌套循环。您要完成什么,仅在上下文之外查看嵌套循环非常难以理解....
-
我在帖子中添加了更多细节
标签: python pandas auto-vectorization