我必须使用apply访问当前行和先前计算的值的值。以下是代码段。如何优化此代码以更快地工作?
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(30, 1)), columns=['ABCD'])
for idx in range(0, len(df)):
df.ix[idx, 'flag'] = 0
if 0 == idx:
continue
if df.ix[idx, 'ABCD'] >= 66:
df.ix[idx, 'flag'] = 1
elif df.ix[idx, 'ABCD'] <= 33:
df.ix[idx, 'flag'] = 0
else:
df.ix[idx, 'flag'] = df.ix[idx-1, 'flag']
print df
在这里,我必须使用&#39; ABCD&#39;中的值。如果值> 66,flag应该设置为1并且&lt; 33,标志应为0。 对于其他值,它应该重复以前的flag值。
请告诉我如何优化此功能?
答案 0 :(得分:0)
您可以使用np.where
来向量化if/else
;当值> = 66时将标志设置为1,当值<= 33时设置为0,否则设置为NaN然后对结果flag
列进行前向填充:
df['flag0'] = pd.np.where(df.ABCD >= 66, 1,
pd.np.where(df.ABCD <= 33, 0, pd.np.nan))
df['flag0'] = df['flag0'].ffill()
(df.flag == df.flag0).all()
# True