Pandas选择最后一行值比grater

时间:2017-01-29 12:03:32

标签: python pandas

我有一个数据框

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)

1 个答案:

答案 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