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

如何根据DataFrame的from和to列计算对应列数值的差值?

问题描述

现有如下DataFrame:

import pandas as pd

data = {
    'AT': [2, 3, 4, 5, 6],
    'BE': [4, 6, 8, 10, 12],
    'DE': [6, 7, 8, 9, 10],
    'FR': [12, 14, 16, 18, 20],
    'NL': [4, 7, 10, 13, 16],
    'from': ['DE', 'AT', 'BE', 'BE', 'NL'],
    'to': ['AT', 'FR', 'FR', 'FR', 'DE']
}
df = pd.DataFrame(data, index=[10365, 10366, 10370, 10370, 10380])

原始数据输出如下:

AT  BE  DE  FR  NL from  to
10365     2   4   6  12   4   DE  AT
10366     3   6   7  14   7   AT  FR
10370     4   8   8  16  10   BE  FR
10370     5  10   9  18  13   BE  FR
10380     6  12  10  20  16   NL  DE

需要新增result列,规则为:用每行from列指定的列名对应数值,减去to列指定的列名对应数值,最终得到目标结果:

AT  BE  DE  FR  NL from  to  result
10365     2   4   6  12   4   DE  AT       4
10366     3   6   7  14   7   AT  FR     -11
10370     4   8   8  16  10   BE  FR      -8
10370     5  10   9  18  13   BE  FR      -8
10380     6  12  10  20  16   NL  DE       6
解决方案

方法1:apply逐行处理(简单直观)

直接对每行执行自定义逻辑,提取对应列值做减法:

df['result'] = df.apply(lambda row: row[row['from']] - row[row['to']], axis=1)

优点是逻辑易懂,适合小数据集;缺点是逐行循环,大数据量下性能较差。

方法2:df.lookup(高效简洁)

利用lookup方法按行索引和列名批量匹配取值,属于向量化操作:

df['result'] = df.lookup(df.index, df['from']) - df.lookup(df.index, df['to'])

性能远优于apply,代码简洁,适合中等规模数据集。

方法3:numpytake(性能最优)

基于numpy底层向量化操作,先获取列名的位置索引,再提取对应值计算:

import numpy as np

# 获取from和to列名对应的列索引位置
from_col_idx = df.columns.get_indexer(df['from'])
to_col_idx = df.columns.get_indexer(df['to'])

# 提取对应位置的数值并计算差值
df['result'] = df.values[np.arange(len(df)), from_col_idx] - df.values[np.arange(len(df)), to_col_idx]

三者中性能最好,适合超大规模数据集处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:01:11