有无类似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
相关产品推荐
相关产品推荐

