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

如何按指定顺序提取Pandas DataFrame对应列的数值?

按指定顺序提取分组后的数值向量解决方案

先从你给出的简化场景入手,再延伸到实际的复杂多列多行分组需求,给你几个高效的实现方法:

一、简化场景:基础DataFrame提取

先把你提到的简化版DataFrame整理成正确的结构化形式:

import pandas as pd

df = pd.DataFrame({
    'col1': ['Apple', 'Lemon', 'Banana'],
    'col2': [70, 80, 90]
})
my_list = ['Banana', 'Apple', 'Lemon']

要按my_list的顺序提取col2的数值,这两个方法都很实用:

方法1:用loc索引匹配

先把col1设为DataFrame的索引,然后直接按my_list的顺序取值,最后转成列表:

result = df.set_index('col1').loc[my_list, 'col2'].tolist()
# 输出结果:[90, 70, 80]

方法2:字典映射快速取值

先把col1和col2转成键值对字典,再遍历my_list提取对应值:

col_map = df.set_index('col1')['col2'].to_dict()
result = [col_map[item] for item in my_list]
# 输出结果:[90, 70, 80]

二、实际复杂场景:按col3分组后统一顺序提取

你的实际数据集包含更多列和大量行,col1会随col3的不同取值重复出现,需要为每个col3的取值,按统一的my_list顺序提取col2的数值向量。先整理你的实际DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['Apple', 'Lemon', 'Banana', 'Lemon', 'Apple', 'Banana', 'Lemon', 'Banana', 'Apple'],
    'col2': [70, 80, 90, 2, 3, 4, 67, 68, 69],
    'col3': ['red', 'red', 'red', 'blue', 'blue', 'blue', 'green', 'green', 'green']
})
# 获取统一顺序的my_list(这里你提到是np.unique(df['col2'])?大概率是笔误,应该是提取col1的唯一值,我先按这个来,要是确实是col2的话替换对应列就行)
my_list = np.unique(df['col1']).tolist()
# np.unique会自动排序,输出:['Apple', 'Banana', 'Lemon']

针对这种分组需求,推荐用pandas原生的分组+重新索引/透视表方法,高效且适配大规模数据:

方法1:分组后重新索引保证顺序

先按col3分组,对每个分组重新按my_list排序,提取col2并转成列表:

# 定义处理单个分组的函数
def process_group(group):
    # 将col1设为索引,按my_list重新索引,确保每个分组的顺序完全统一
    ordered_series = group.set_index('col1')['col2'].reindex(my_list)
    return ordered_series.tolist()

# 按col3分组并应用处理函数,转成字典方便查看每个col3对应的向量
result_dict = df.groupby('col3').apply(process_group).to_dict()

输出结果:

{
    'blue': [3, 4, 2],
    'green': [69, 68, 67],
    'red': [70, 90, 80]
}

这个方法的优势是:如果某个分组里col1有缺失值,reindex会自动填充NaN,方便后续的缺失值处理。

方法2:透视表快速生成结构化结果

如果需要更直观的表格形式,用透视表可以一步到位:

# 生成透视表,按col3分组,col1为列,col2为值,再按my_list调整列顺序
pivot_df = df.pivot(index='col3', columns='col1', values='col2')[my_list]
# 把每行转成列表,得到每个col3对应的数值向量
result_dict = pivot_df.apply(list, axis=1).to_dict()

这个方法和上面的结果完全一致,透视表的形式也更便于后续的数据分析和可视化。

小提示

  • 如果你的my_list确实是np.unique(df['col2']),只需要把代码里的col1替换成col2即可,逻辑完全通用。
  • 当数据量很大时,这两种方法都比手动循环遍历高效得多,是pandas处理分组排序的最优实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:30:40