【问题标题】:IF sentence in a FOR loop throughout a dataframe: performance improvement整个数据帧中的 FOR 循环中的 IF 语句:性能提升
【发布时间】:2018-03-25 12:54:57
【问题描述】:

我在整个 pandas datafame 的 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]

【问题讨论】:

  • 您可以添加数据样本,5 行的预期输出吗?

标签: python pandas for-loop if-statement


【解决方案1】:

我认为需要加倍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 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

【讨论】:

    【解决方案2】:

    您应该可以使用 2 个 loc 语句来完成此操作,类似于:

    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 运算符或类似的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 2016-06-16
      • 2019-06-09
      • 1970-01-01
      相关资源
      最近更新 更多