我有一个数据帧
a = {'Price': [10, 15, 5, 25, 30], 'Total': [10000, 12000, 15000, 14000, 0],
'WAP': [10, 10.83, 9.66, 1, 1]}
a = pd.DataFrame(a)
print (a)我希望创建一个新的列,它说,如果一个‘’WAP‘== 1,然后查看一个’‘WAP’,并返回列中的前一个值不是1。
所以在这个例子中,我想创建一个带有值的新列,
new = [10, 10.83, 9.66, 9.66, 9.66]我尝试迭代该列,但只能将第一个1更改为9.66
aw = []
for i in range(len(a)):
if a.loc[i, 'WAP'] == 1:
aw.append(a.loc[i-1, 'WAP'])
else:
aw.append(a.loc[i, 'WAP'])
print (aw)发布于 2017-01-29 20:09:17
一种可能的解决方案是:
for i, row in a.iterrows():
if row['WAP'] == 1:
a.loc[i, 'WAP'] = a.loc[i-1, 'WAP']
else:
a.loc[i, 'WAP'] = a.loc[i,'WAP']
print (a)
Price Total WAP
0 10 10000 10.00
1 15 12000 10.83
2 5 15000 9.66
3 25 14000 9.66
4 30 0 9.66计算的迭代性质,其中输入取决于先前步骤的结果,这使得矢量化变得复杂。您也许可以将apply与一个与循环执行相同计算的函数一起使用,但在幕后,这也是一个循环。
另一个更好的解决方案是将1替换为NaN,然后将mask替换为ffill之前的值:
a.WAP = a.WAP.mask(a.WAP == 1).ffill()
print (a)
Price Total WAP
0 10 10000 10.00
1 15 12000 10.83
2 5 15000 9.66
3 25 14000 9.66
4 30 0 9.66使用replace的解决方案
a.WAP = a.WAP.replace({1:np.nan}).ffill()
print (a)
Price Total WAP
0 10 10000 10.00
1 15 12000 10.83
2 5 15000 9.66
3 25 14000 9.66
4 30 0 9.66https://stackoverflow.com/questions/41920675
复制相似问题