如何在Pandas DataFrame中从第二行开始填充acc与decc列
问题描述
现有如下DataFrame:
import pandas as pd import numpy as np df=pd.DataFrame(data={'speed':[63.000,65.000,65.000,64.000,63.000], 'acc':[np.nan]*5,'decc':[np.nan]*5})
需要按照以下逻辑填充acc和decc列:
for x in range(len(speed)-1): y=speed[x+1]-speed[x] if y>0: acc[x+1]=y decc[x+1]=0 elif y<0: acc[x+1]=0 decc[x+1]=y else: acc[x+1]=0 decc[x+1]=0
即基于speed列相邻元素的差值,从第二行开始为acc和decc列赋值,希望用DataFrame的Series操作实现,替代循环。
解决方案
可以利用Pandas的diff()方法直接计算相邻速度的差值,再通过条件判断生成目标列,全程无需循环,效率更高:
import pandas as pd import numpy as np # 初始化DataFrame df = pd.DataFrame(data={'speed':[63.000,65.000,65.000,64.000,63.000], 'acc':[np.nan]*5,'decc':[np.nan]*5}) # 计算相邻speed的差值,diff()默认后减前,对应原逻辑中的y = speed[x+1] - speed[x] speed_diff = df['speed'].diff() # 填充acc列:差值>0时取差值,否则取0 df['acc'] = speed_diff.where(speed_diff > 0, 0) # 若需要第一行也设为0,可添加:df['acc'].fillna(0, inplace=True) # 填充decc列:差值<0时取差值,否则取0 df['decc'] = speed_diff.where(speed_diff < 0, 0) # 若需要第一行也设为0,可添加:df['decc'].fillna(0, inplace=True)
结果示例
执行后得到的DataFrame如下:
| speed | acc | decc |
|---|---|---|
| 63 | NaN | NaN |
| 65 | 2.0 | 0 |
| 65 | 0.0 | 0 |
| 64 | 0.0 | -1.0 |
| 63 | 0.0 | -1.0 |
关键逻辑说明
df['speed'].diff():直接计算当前行与上一行的差值,返回的Series第一行为NaN,其余行对应原逻辑中的y值。where()方法:实现条件赋值,满足指定条件时保留原数值,否则替换为指定值,完美对应原逻辑的分支判断。
内容的提问来源于stack exchange,提问作者savvas pehlivanidis
相关产品推荐
相关产品推荐

