python - 整个数据帧中 FOR 循环中的 IF 语句 : performance improvement

标签 python pandas for-loop if-statement

我在整个 pandas 数据帧的 for 循环中使用 if 语句,但处理时间太长。有没有办法在不使用 for 循环的情况下执行此操作?

for i in data.index:
    if data['qt_CNAE'][i] > 20:
        data['CNAEuse'][i]=data['CNAE'][i]
        data['CNAEuse_Cres'][i]=data['Crescimento_CNAE'][i]

最佳答案

我认为需要双 numpy.where :

mask = data['qt_CNAE'] > 20
data['CNAEuse']= np.where(mask, data['CNAE'], data['CNAEuse'])
data['CNAEuse_Cres']=np.where(mask, data['Crescimento_CNAE'], data['CNAEuse_Cres'])

或者更好地使用numpy广播:

mask = data['qt_CNAE'] > 20
df[['CNAEuse','CNAEuse_Cres']] =(np.where(mask[:, None],
                                          df[['CNAE','Crescimento_CNAE']], 
                                          df[['CNAEuse','CNAEuse_Cres']]))

示例:

df = pd.DataFrame({'A':list('abcdef'),
                   'B':[4,5,4,5,5,4],
                   'C':[7,8,9,4,2,3],
                   'D':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4],
                   'F':list('aaabbb')})

print (df)
   A  B  C  D  E  F
0  a  4  7  1  5  a
1  b  5  8  3  3  a
2  c  4  9  5  6  a
3  d  5  4  7  9  b
4  e  5  2  1  2  b
5  f  4  3  0  4  b

mask = df.F == 'a'
df[['B','D']] = np.where(mask[:, None], df[['C','E']], df[['B','D']])
print (df)
   A  B  C  D  E  F
0  a  7  7  5  5  a
1  b  8  8  3  3  a
2  c  9  9  6  6  a
3  d  5  4  7  9  b
4  e  5  2  1  2  b
5  f  4  3  0  4  b

关于python - 整个数据帧中 FOR 循环中的 IF 语句 : performance improvement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49476076/

相关文章:

python - 将 `numpy` 数组的元素清零(按行)小于给定向量的值

python - 将某些列保留在 pandas DataFrame 中,删除其他所有内容

将多个文件读入多个数据框

r - 加速二次形式的评估

Python:try-catch-else 不处理异常。可能的?

python - 有没有一种方法可以在不调用 TypeError 的情况下使用错误数量的参数调用 Python 函数?

python - 仅抓取整个网站的图像 URL

python - 如何为我的数据集标记或勾选 Pandas?

python - 将 nan 转换为 NaN 有多大用处?

python - 在python中查找嵌套列表内外的重复项