我有一个数据框
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)
答案 0 :(得分:2)
一种可能的解决方案:
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.66