如何用Pandas基于上一行值与另一列值相乘创建新列?
解决方法
你的需求本质是计算累积乘积,用pandas内置的cumprod()函数就能直接实现,完全不需要手动处理shift或者循环,代码如下:
import pandas as pd # 你的示例数据 data = { 'time': [0, 1, 2, 3, 4], 'val': [1, 0.5, 0.6, 0.7, 0.9] } df = pd.DataFrame(data) # 生成adj_val列 df['adj_val'] = df['val'].cumprod()
运行后得到的结果和你给出的示例完全一致:
| time | val | adj_val |
|---|---|---|
| 0 | 1 | 1.0 |
| 1 | 0.5 | 0.5 |
| 2 | 0.6 | 0.3 |
| 3 | 0.7 | 0.21 |
| 4 | 0.9 | 0.189 |
为什么你之前的代码没成功?
你先设置了第一行的new_col,但后续执行df['new_col'] = df['new_col'].shift(1)*df['other_col']时,df['new_col']除了第一行有值,其他行都是NaN。shift(1)后,第二行能取到第一行的值,但第三行及以后取到的都是NaN,相乘后结果自然不对,而且这行代码会直接覆盖掉你之前设置的第一行值,导致最终只有第二行有有效数据。
特殊情况处理(如果首行值不是val列的首行)
如果你的首行adj_val不是val的首行值,比如首行需要设为某个固定值(比如2),再乘后续的val,可以这样写:
# 首行设为固定值,后续累积乘val df['adj_val'] = pd.concat([pd.Series([2]), df['val'].iloc[1:]]).cumprod()
内容的提问来源于stack exchange,提问作者Yusuf
相关产品推荐
相关产品推荐

