当前位置: 首页 > ds >正文

Python EXCEL 小技巧:最快重新排列dataframe函数

工作原理

1.获取所有列名。
2.根据输入的列标识(列名或列索引)确定要移动的列名。
3.检查新位置是否有效。
4.先移除要移动的列,然后在新的位置插入该列。
5.返回一个新的DataFrame。

V1.0

def move_column(df, col_identifier, new_idx):"""移动DataFrame的列到新位置参数:df: pandas DataFramecol_identifier: 可以是列名(str)或列索引(int)new_idx: 新的位置索引(从0开始)返回:调整列顺序后的新DataFrame"""# 获取所有列名cols = list(df.columns)# 根据输入类型确定要移动的列if isinstance(col_identifier, str):# 列名输入if col_identifier not in cols:raise ValueError(f"列名 '{col_identifier}' 不存在于DataFrame中")col_to_move = col_identifierelif isinstance(col_identifier, int):# 列索引输入if col_identifier < 0 or col_identifier >= len(cols):raise IndexError(f"列索引 {col_identifier} 超出范围")col_to_move = cols[col_identifier]else:raise TypeError("col_identifier 必须是字符串(列名)或整数(列索引)")# 确保新位置有效if new_idx < 0 or new_idx > len(cols):raise IndexError(f"新位置索引 {new_idx} 无效")# 创建新列顺序new_cols = [col for col in cols if col != col_to_move]  # 移除要移动的列new_cols.insert(new_idx, col_to_move)  # 在指定位置插入该列return df[new_cols]

使用示例

import pandas as pd# 创建示例DataFrame
data = {'姓名': ['张三', '李四', '王五'],'年龄': [25, 30, 28],'性别': ['男', '男', '女'],'sim': [0.8, 0.9, 0.7],  # 第四列'城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)print("原始列顺序:")
print(df.columns.tolist())  # ['姓名', '年龄', '性别', 'sim', '城市']# 使用列名移动
df_moved = move_column(df, 'sim', 1)  # 将'sim'列移动到第2个位置
print("\n移动后列顺序:")
print(df_moved.columns.tolist())  # ['姓名', 'sim', '年龄', '性别', '城市']# 使用列索引移动(效果相同)
df_moved2 = move_column(df, 3, 1)  # 将第4列移动到第2个位置
print("\n使用索引移动后列顺序:")
print(df_moved2.columns.tolist())  # ['姓名', 'sim', '年龄', '性别', '城市']

函数特点

  1. 双重支持:同时支持列名(str)和列索引(int)作为输入
  2. 错误处理:
    • 检查列名是否存在
    • 验证列索引是否有效
    • 确保新位置在合理范围内
  3. 清晰文档:包含详细的函数说明和参数解释
  4. 高效实现:使用列表推导式高效创建新列顺序

使用建议

  • 当列名已知时,推荐使用列名作为输入,这样代码更易读且不受列顺序变化影响
  • 当需要根据位置移动列时,可以使用列索引
  • 该函数不会修改原始DataFrame,而是返回一个新的DataFrame

2.0

使用pop和insert(更简洁)

def move_column_efficient(df, col_identifier, new_idx):"""使用pop和insert高效移动列"""cols = list(df.columns)# 确定要移动的列索引if isinstance(col_identifier, str):if col_identifier not in cols:raise ValueError(f"列名 '{col_identifier}' 不存在于DataFrame中")old_idx = cols.index(col_identifier)elif isinstance(col_identifier, int):if col_identifier < 0 or col_identifier >= len(cols):raise IndexError(f"列索引 {col_identifier} 超出范围")old_idx = col_identifierelse:raise TypeError("col_identifier 必须是字符串(列名)或整数(列索引)")# 确保新位置有效if new_idx < 0 or new_idx > len(cols):raise IndexError(f"新位置索引 {new_idx} 无效")# 使用pop和insert一次性完成操作col_name = cols.pop(old_idx)cols.insert(new_idx, col_name)return df[cols]

2.1

def move_column_efficient(df, col_identifier, new_idx):"""高效移动DataFrame列位置参数:df: pandas DataFramecol_identifier: 列名(str)或列索引(int)new_idx: 目标位置索引(0-based)返回:调整列顺序后的新DataFrame"""cols = list(df.columns)# 处理列标识符if isinstance(col_identifier, str):if col_identifier not in cols:raise ValueError(f"列名 '{col_identifier}' 不存在")old_idx = cols.index(col_identifier)elif isinstance(col_identifier, int):if not (0 <= col_identifier < len(cols)):raise IndexError(f"列索引 {col_identifier} 超出范围[0, {len(cols)-1}]")old_idx = col_identifierelse:raise TypeError("参数必须是列名字符串或列索引整数")# 处理新位置索引if not (0 <= new_idx <= len(cols)):raise IndexError(f"新位置索引 {new_idx} 应在[0, {len(cols)}]范围内")# 高效移动列if old_idx != new_idx:  # 仅当位置不同时操作col_name = cols.pop(old_idx)# 调整新位置索引(如果旧索引在新索引之前)adj_new_idx = new_idx - 1 if old_idx < new_idx else new_idxcols.insert(adj_new_idx, col_name)return df[cols]
def move_column_efficient(df, col_identifier, new_idx):"""Efficiently repositions a column within a DataFrame.Parameters:df: pandas DataFrameThe input DataFrame.col_identifier: str or intColumn name (string) or column index (integer).new_idx: intTarget position index (0-based).Returns:DataFrameA new DataFrame with the column order adjusted."""cols = list(df.columns)# Handle column identifierif isinstance(col_identifier, str):if col_identifier not in cols:raise ValueError(f"Column name '{col_identifier}' does not exist")old_idx = cols.index(col_identifier)elif isinstance(col_identifier, int):if not (0 <= col_identifier < len(cols)):raise IndexError(f"Column index {col_identifier} is out of range [0, {len(cols)-1}]")old_idx = col_identifierelse:raise TypeError("Parameter must be a column name string or column index integer")# Validate target position indexif not (0 <= new_idx <= len(cols)):raise IndexError(f"Target position index {new_idx} must be within [0, {len(cols)}]")# Efficiently reposition columnif old_idx != new_idx:  # Only perform operation if positions differcol_name = cols.pop(old_idx)# Adjust target index if original index precedes the target positionadj_new_idx = new_idx - 1 if old_idx < new_idx else new_idxcols.insert(adj_new_idx, col_name)return df[cols]

改进点说明

  1. 添加位置变化检查:避免不必要的列顺序调整
if old_idx != new_idx:  # 仅当位置不同时操作
  1. 更精确的新位置索引处理:解决当旧索引在新索引之前时,pop操作后索引偏移的问题
   adj_new_idx = new_idx - 1 if old_idx < new_idx else new_idx
  1. 更详细的错误信息:提供更具体的范围提示
raise IndexError(f"列索引 {col_identifier} 超出范围[0, {len(cols)-1}]")
http://www.xdnf.cn/news/20118.html

相关文章:

  • 工业机器人标杆的数字化突围,珞石机器人如何以CRM实现业务重塑
  • 技术视界 | 跨域机器人通信与智能系统:打破壁垒的开源探索
  • 【Linux】环境变量与程序地址空间详解
  • ansible-角色
  • MySQL知识
  • 【C++】17. AVL树实现
  • 探索未来智能自动化,一个强大的自动化引擎
  • 苹果Vision Air蓝图或定档2027,三星/微美全息加速XR+AI核心生态布局卡位
  • 第二阶段WinForm-13:图表控件,N层架构,Dapper
  • 【数学建模学习笔记】机器学习分类:决策树分类
  • 团队协作与接口联调 Charles抓包工具在多人开发中的高效应用
  • WEBSTORM前端 —— 第4章:JavaScript —— 第7节:函数
  • 安徽造价信息网期刊及工程材料信息价
  • 去中心化投票系统开发教程 第一章:区块链基础知识
  • 新一代Agent(智能体),路在低代码?
  • 【Dify】使用工具节点实现 API 接口调用与 JSON 处理
  • 深入 Spring MVC 底层:从 DispatcherServlet 到自定义组件的全链路解析
  • 隔空盗刷、AI钓鱼、代理劫持…金融黑产竟进化至此?
  • Rewind-你人生的搜索引擎
  • 26、Jenkins流水线
  • 解密llama.cpp:从Prompt到Response的完整技术流程剖析
  • 从 GPT 到 LLaMA:解密 LLM 的核心架构——Decoder-Only 模型
  • Loopback for Mac:一键打造虚拟音频矩阵,实现跨应用音频自由流转
  • 用Markdown写自动化用例:Gauge实战全攻略!
  • AV1 OBU Frame解析
  • 系统编程day2-系统调用
  • 游戏世代网页官网入口 - 游戏历史记录和统计工具
  • Guidelines for using Adaptive Platform interfaces
  • 2025年互联网行业专业认证发展路径分析
  • GO学习记录九——数据库触发器的使用+redis缓存策略