首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据来自不同列的前一行的值设置新列

根据来自不同列的前一行的值设置新列
EN

Stack Overflow用户
提问于 2021-11-17 19:36:46
回答 1查看 24关注 0票数 0

我正在寻找一种有效的方法来根据来自不同列的前一行的值来设置新列。假设你有这个DataFrame:

代码语言:javascript
运行
复制
pd.DataFrame([[0, 22], [1, 15], [2, 18], [3, 9], [4, 10], [6, 11], [8, 12]],
             columns=['days', 'quantity'])
代码语言:javascript
运行
复制
   days  quantity
0     0        22
1     1        15
2     2        18
3     3         9
4     4        10
5     6        11
6     8        12

现在,我想要有第三列‘quantity_3day_ago’,如下所示:

代码语言:javascript
运行
复制
   days  quantity  quantity_3days_ago
0     0        22                 NaN
1     1        15                 NaN
2     2        18                 NaN
3     3         9                  22
4     4        10                  15
5     6        11                   9
6     8        12                  10

因此,我需要使用“天”栏来检查“数量”栏在3天前显示的内容。如果'days‘列中没有确切的值,我希望'quantity_3days_ago’是前一行的值。以最后一行为例:8-3将是5,在这种情况下,我会将天数等于4的行的'quantity‘值作为’quantity_3day_ago‘。我希望这是可以理解的。我试着使用滚动窗口和移位,但我不能得到想要的结果。我猜在整个DataFrame上使用循环是可能的。然而,这将是相当低效的。我想知道这是否可以在一行中完成。感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-17 19:50:25

我们可以在shift之前做reindex

代码语言:javascript
运行
复制
rng = range(df.days.iloc[0],df.days.iloc[-1]+1)
df['new'] = df.days.map(df.set_index('days').reindex(rng ,method='ffill')['quantity'].shift(3))
df
Out[125]: 
   days  quantity   new
0     0        22   NaN
1     1        15   NaN
2     2        18   NaN
3     3         9  22.0
4     4        10  15.0
5     6        11   9.0
6     8        12  10.0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70010512

复制
相关文章

相似问题

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