我有一个数据框

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)


我正在寻找创建一个新列,该列显示a ['WAP'] == 1,然后查看a ['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)

最佳答案

一种可能的解决方案:

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与一个函数进行计算,该函数的计算与循环相同,但是在后台,这也将是一个循环。

另一个更好的解决方案是将1NaN替换为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

关于python - Pandas 选择的最后一行值大于,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41920675/

10-12 18:21