首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas选择最后一行的值大于

Pandas选择最后一行的值大于
EN

Stack Overflow用户
提问于 2017-01-29 20:03:32
回答 1查看 493关注 0票数 1

我有一个数据帧

代码语言:javascript
复制
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。

所以在这个例子中,我想创建一个带有值的新列,

代码语言:javascript
复制
new = [10, 10.83, 9.66, 9.66, 9.66]

我尝试迭代该列,但只能将第一个1更改为9.66

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-29 20:09:17

一种可能的解决方案是:

代码语言:javascript
复制
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之前的值:

代码语言:javascript
复制
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的解决方案

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41920675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档