数据帧中FOR循环中IF语句的性能改进

2024-04-29 13:03:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在整个数据库的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]

Tags: 方法in数据库fordataindexif时间
2条回答

我想需要两个^{}

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 broadcasting

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

您应该可以使用2loc语句来完成,大致如下:

data.loc[data['qt_CNAE'] > 20, 'CNAEuse'] = data['CNAE']
data.loc[data['qt_CNAE'] > 20, 'CNAEuse_Cres'] = data['Crescimento_CNAE']

仅供参考,现有的链式索引(例如data['CNAEuse'][i])在pandas中通常是不好的,通常会导致设置时出现复制错误。最好使用loc运算符或类似的运算符

相关问题 更多 >