【发布时间】:2018-11-29 17:57:48
【问题描述】:
我希望有效地使用pandas(或numpy)而不是带有if 语句的嵌套for 循环来解决特定问题。这是一个玩具版本:
假设我有以下两个 DataFrames
import pandas as pd
import numpy as np
dict1 = {'vals': [100,200], 'in': [0,1], 'out' :[1,3]}
df1 = pd.DataFrame(data=dict1)
dict2 = {'vals': [500,800,300,200], 'in': [0.1,0.5,2,4], 'out' :[0.5,2,4,5]}
df2 = pd.DataFrame(data=dict2)
现在我希望遍历每个数据帧的每一行,并在满足特定条件时将 vals 相乘。这段代码适用于我想要的
ans = []
for i in range(len(df1)):
for j in range(len(df2)):
if (df1['in'][i] <= df2['out'][j] and df1['out'][i] >= df2['in'][j]):
ans.append(df1['vals'][i]*df2['vals'][j])
np.sum(ans)
但是,显然这非常效率低下,实际上我的 DataFrame 可能有数百万个条目,这使得它无法使用。我也没有让我们使用pandas 或numpy 高效的向量实现。有谁知道如何有效地矢量化这个嵌套循环?
我觉得这段代码类似于矩阵乘法,所以使用outer 可以取得进展吗?这是if 条件,我发现很难融入其中,因为if 逻辑需要将df1 中的每个条目与df2 中的所有条目进行比较。
【问题讨论】:
-
这可以实现为矩阵形式,但如果如你所说的数据帧有数百万行,那么交叉矩阵将是数百万。在这种情况下,它始终是内存和 CPU 之间的补偿。您可以以内存为代价对代码进行矢量化处理,或者使用
itertooples获得更高效的代码。当您有许多较小的向量而不是两个巨大的向量时,向量化是最有效的。
标签: python pandas numpy vectorization