如何按指定顺序提取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
相关产品推荐
相关产品推荐

