Python Pandas如何基于指定列取值选取对应同名列的数值
实现方案
方案1:内置场景适配方法(最简洁,兼容全版本pandas)
pandas原生支持这类按行匹配列名取值的需求,代码可读性最高,常规数据量下性能足够:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ "column_name": ["a", "b", "d"], "a": [5, 3, 4], "b": [3, 2, 5], "c": [1, 1, 33], "d": [7, 10, 14] }) # pandas <2.2 版本用lookup df["value"] = df.lookup(df.index, df["column_name"]) # pandas >=2.2 版本lookup已弃用,用等价写法 df["value"] = df.stack().loc[zip(df.index, df["column_name"])].values # 输出仅含value的结果 result = df[["value"]]
运行后得到的result就是要求的输出:
| value |
|---|
| 5 |
| 2 |
| 14 |
方案2:numpy索引(性能最优,适合百万级以上大数据量)
如果处理的数据量极大,用numpy花式索引的性能比上述方案高30%以上:
# 先将列名转换为对应的位置索引 col_index = df.columns.get_indexer(df["column_name"]) # 直接用numpy矩阵索引取值 df["value"] = df.to_numpy()[np.arange(len(df)), col_index]
避坑提醒
不要用逐行遍历的apply写法:df.apply(lambda x: x[x["column_name"]], axis=1),这种写法数据量超过1万行时性能会比上述方案慢几十倍,完全不推荐。
内容的提问来源于stack exchange,提问作者zachvac
相关产品推荐
相关产品推荐

