如何根据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
相关产品推荐
相关产品推荐

