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
相关产品推荐
相关产品推荐

