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

有无类似np.r_的Pandas方法,可通过列索引重排DataFrame列?

问题描述

我有一个结构如下的DataFrame:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 191 entries, 0 to 190
Data columns (total 11 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Country                   191 non-null    object 
 1   Energy Supply             172 non-null    float64
 2   Energy Supply per Capita  172 non-null    float64
 3   % Renewable               173 non-null    float64
 4   Rank                      191 non-null    int64  
 5   Documents                 191 non-null    int64  
 6   Citable documents         191 non-null    int64  
 7   Citations                 191 non-null    int64  
 8   Self-citations            191 non-null    int64  
 9   Citations per document    191 non-null    float64
 10  H index                   191 non-null    int64  
dtypes: float64(4), int64(6), object(1)
memory usage: 16.5+ KB

希望将列重排为以下顺序:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 191 entries, 0 to 190
Data columns (total 11 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Country                   191 non-null    object 
 1   Rank                      191 non-null    int64  
 2   Documents                 191 non-null    int64  
 3   Citable documents         191 non-null    int64  
 4   Citations                 191 non-null    int64  
 5   Self-citations            191 non-null    int64  
 6   Citations per document    191 non-null    float64
 7   H index                   191 non-null    int64  
 8   Energy Supply             172 non-null    float64
 9   Energy Supply per Capita  172 non-null    float64
 10  % Renewable               173 non-null    float64
dtypes: float64(4), int64(6), object(1)
memory usage: 16.5+ KB

我已通过以下两种代码实现该重排:

# 方法1:利用iloc索引
EnScMerged = pd.merge(Energy,ScimEn, on='Country',how='right').iloc[:,np.r_[0:1, 4:11, 1:4]]
# 方法2:reindex手动指定列名
EnScMerged_=EnScMerged.reindex(columns = ['Country','Rank','Documents','Citable documents','Citations','Self-citations','H index','Energy Supply','Energy Supply per Capita','% Renewable'])

我希望找到无需手动输入所有列名的最简方式,请问是否存在这类Pandas方法?

解决方案

当然有,以下是几种无需手动全量输入列名的简洁方法:

方法1:利用原始DataFrame的列名(推荐)

如果你还保留着合并前的Energy和ScimEn两个DataFrame,可以直接提取它们的列名组合目标顺序,完全不用手动列任何业务列名:

# 提取ScimEn中除Country外的所有列
scim_cols = ScimEn.columns.drop('Country')
# 提取Energy中除Country外的所有列
energy_cols = Energy.columns.drop('Country')
# 组合成目标列顺序
new_order = ['Country'] + scim_cols.tolist() + energy_cols.tolist()
# 重排DataFrame列
EnScMerged = EnScMerged[new_order]

这种方法的优势是完全依赖原始数据源的列结构,后续如果原始DataFrame的列有增减,代码会自动适配,不用手动修改。

方法2:按列名特征筛选

如果已经没有保留原始的Energy和ScimEn,可以通过列名的特征分组筛选,只需要少量手动标记区分两类列:

# 筛选出学术相关的列(排除Country和能源类列)
scim_cols = [col for col in EnScMerged.columns 
             if col not in ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable']]
# 筛选出能源相关的列
energy_cols = [col for col in EnScMerged.columns 
               if col in ['Energy Supply', 'Energy Supply per Capita', '% Renewable']]
# 组合重排
new_order = ['Country'] + scim_cols + energy_cols
EnScMerged = EnScMerged[new_order]

这种方法只需要手动标记能源类的3个列名,比全量输入11个列名简洁很多。

方法3:利用iloc简化索引(优化你已有的方法)

你已经在使用iloc结合np.r_的方法,可以进一步简化写法,不用依赖numpy:

EnScMerged = pd.merge(Energy, ScimEn, on='Country', how='right')
# 直接用列索引列表重排
EnScMerged = EnScMerged.iloc[:, [0] + list(range(4,11)) + list(range(1,4))]

这种写法避免了引入numpy,纯用Pandas和Python内置函数实现,同样不需要输入列名。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:38