如何按指定列表顺序匹配pandas DataFrame某列并取出对应另一列的值
问题根源
你现有代码的问题在于:isin()方法仅负责筛选出符合条件的行,返回结果默认遵循DataFrame原本的行顺序,不会匹配你传入的列表li的自定义排序规则,因此无法得到预期输出。
实现方案
方案1:set_index + reindex 极简实现(推荐,适合column2无重复值场景)
直接将column2设为索引后,按照li的顺序重排索引,再提取column1的值即可:
import numpy as np import pandas as pd # 示例数据 df = pd.DataFrame({'column1': ['A', 'B', 'C'], 'column2': ['h', 'l', 'p']}) li = ['p', 'l'] # 核心代码 result = df.set_index('column2').reindex(li)['column1'].values
运行后result的值就是你需要的np.array(['C', 'B'])。如果li中存在column2没有的取值,可在reindex后加.dropna()过滤空值。
方案2:自定义排序映射(兼容column2有重复值、旧版本pandas场景)
先给列表li里的每个元素生成顺序优先级,筛选匹配行后按照优先级排序再取值:
# 生成顺序映射字典 order_map = {val: idx for idx, val in enumerate(li)} # 筛选+排序+取值 result = df[df['column2'].isin(li)]\ .assign(sort_order = df['column2'].map(order_map))\ .sort_values('sort_order')['column1'].values
内容的提问来源于stack exchange,提问作者Ryszard Eggink
相关产品推荐
相关产品推荐

