You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame中批量计算动物相对位移的向量化方法求助

高效实现相对位移计算的向量化方案

首先注意你的Displacement列是字符串类型,第一步需要先转换为数值类型才能进行运算:

import pandas as pd
df = pd.DataFrame({
'Time': ['0','0','0','1','1','1','2','2','2'],
'Animal': ['Cat', 'Dog', 'Pig', 'Cat', 'Dog', 'Pig', 'Cat', 'Dog', 'Pig'],
'Displacement': ['1', '3', '2', '4', '2', '3', '1', '4', '6']
})

# 转换Displacement为整数类型
df['Displacement'] = df['Displacement'].astype(int)

接下来用两种高效的向量化方法实现需求:

方法一:提取基准值后映射计算

这种方法直接提取每个动物在Time=0时的位移作为基准,再通过映射匹配到每一行进行差值计算,效率最高:

# 提取每个动物Time=0时的位移,构建Animal到初始位移的映射
initial_disp = df[df['Time'] == '0'].set_index('Animal')['Displacement']
# 计算相对位移
df['RelativeDisplacement'] = df['Displacement'] - df['Animal'].map(initial_disp)

方法二:分组后使用transform计算

通过groupby按动物分组,再用transform对每组内的数据计算与初始位移的差值:

df['RelativeDisplacement'] = df.groupby('Animal').apply(
    lambda group: group['Displacement'] - group[group['Time'] == '0']['Displacement'].iloc[0]
).reset_index(drop=True)

或者更简洁的transform写法:

df['RelativeDisplacement'] = df.groupby('Animal')['Displacement'].transform(
    lambda x: x - x[df.loc[x.index, 'Time'] == '0'].iloc[0]
)

运行后最终的DataFrame结果:

Time Animal  Displacement  RelativeDisplacement
0    0    Cat             1                     0
1    0    Dog             3                     0
2    0    Pig             2                     0
3    1    Cat             4                     3
4    1    Dog             2                    -1
5    1    Pig             3                     1
6    2    Cat             1                     0
7    2    Dog             4                     1
8    2    Pig             6                     4

内容的提问来源于stack exchange,提问作者Banarnia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:10:09