如何在 Pandas DataFrame 中按行交换两列中数值与非数值的值

本文介绍一种简洁高效的方法,利用 NumPy 对 DataFrame 中指定两列进行逐行排序并反向切片,自动将每行中数字型值“归位”到目标列(如 age),字符串值则移至另一列(如 last_name),无需手动判断类型或循环。

本文介绍一种简洁高效的方法,利用 numpy 对 dataframe 中指定两列进行逐行排序并反向切片,自动将每行中数字型值“归位”到目标列(如 `age`),字符串值则移至另一列(如 `last_name`),无需手动判断类型或循环。

在实际数据清洗中,常遇到列内容错位的问题:例如本例中 last_name 列混入了年龄数值(如第1行的 36),而 age 列却出现了人名(如 Rabbit)。目标是按行校正两列内容——确保每行中数值落入 age 列,字符串落入 last_name 列。

核心思路是:对指定两列(['last_name', 'age'])执行逐行字符串化 + 字典序排序 + 反向取值,从而天然实现“数值靠右、文本靠左”的效果(因为数字字符串如 '28'、'36' 在字典序中小于人名字符串如 'Bee'、'Rabbit',排序后数值在前;再通过 [::-1] 反转,即可让数值落到 age 列,文本落到 last_name 列)。

✅ 推荐实现代码:

import pandas as pd
import numpy as np

# 构造原始 DataFrame
df = pd.DataFrame([
    ['Captain', 'Crunch', 72],
    ['Trix', 36, 'Rabbit'],
    ['Count', 'Chocula', 41],
    ['Tony', 54, 'Tiger'],
    ['Buzz', 28, 'Bee'],
    ['Toucan', 'Sam', 38]
], columns=['first_name', 'last_name', 'age'])

# 关键修复:对 last_name 和 age 列按行排序并反转顺序
cols = ['last_name', 'age']
df[cols] = np.sort(df[cols].astype(str).to_numpy(), axis=1)[:, ::-1]

⚠️ 注意事项:

  • astype(str) 是必需的,确保数值和字符串可统一比较(否则混合类型排序会报错);
  • to_numpy() 将 DataFrame 子集转为 NumPy 数组,启用高效的逐行 axis=1 排序;
  • [:, ::-1] 表示对每行结果反转,使排序后较小的字符串(如 '28')移到右侧,匹配 age 列位置;
  • 此法假设每行在指定两列中恰好含一个数值和一个字符串;若存在双数值或双字符串,需额外逻辑处理;
  • 修改直接作用于原 DataFrame,如需保留原始数据,请先 df.copy()。

最终输出完全符合预期:所有年龄值正确位于 age 列,所有人名字符串归位至 last_name 列,且顺序与原始行严格对应。该方案简洁、向量化、无显式循环,是处理此类错位问题的典型 Pandas+NumPy 协同范式。

相关推荐:

如何在 LlamaIndex 中正确使用 async/await 进行批量评估

在 LlamaIndex 中调用 aevaluate_queries() 等异步方法时,必须将 await 语句置于 async 函数内部,并通过 asyncio.run() 启动事件循环;直接在模块顶层 await 会导致 SyntaxError,这是 Python 异步语法的硬性限制。 在 llamaindex 中调用 `aevaluate_queries()` 等异步方法时,必须将 `awa...

高效实现 Pandas DataFrame 中基于多列的条件列创建

本文介绍多种优化方法,帮助你在处理大规模数据时高效创建条件列,包括向量化操作、numpy.select、pd.cut 和缓存函数调用等策略,显著减少计算开销并提升可读性与执行速度。 本文介绍多种优化方法,帮助你在处理大规模数据时高效创建条件列,包括向量化操作、`numpy.select`、`pd.cut` 和缓存函数调用等策略,显著减少计算开销并提升可读性与执行速度。 在 Pandas 中为大型 ...

如何在Python中实现高效的相似度搜索_使用Faiss向量数据库加速

Faiss将向量搜索从O(N)降至近O(log N),通过索引、量化与压缩实现加速;选错索引类型会导致构建失败或结果不准,小规模用IndexFlatL2,中大规模依数据量选IVF或HNSW。 为什么直接用 NumPy 算余弦相似度会变慢 当向量数量超过 10 万,用 sklearn.metrics.pairwise.cosine_similarity 或手写 np.dot + 归一化做全量比对,内...

如何在Django中实现复杂的统计报表查询_利用Python的Aggregate聚合函数

Aggregate返回单条字典结果,annotate为每条记录添加字段并保持QuerySet可链式操作;分组聚合必须用values()配合annotate,Aggregate不能用于已分组查询。 直接用 Aggregate 做复杂统计报表,大概率会卡在“查不出想要的分组结构”或“多层聚合嵌套报错”上——它本身不处理分组,只做单次聚合计算,真要出报表,得和 values()、annotate() 配...

如何在 Vespa 中正确集成 ONNX 模型(使用 pyvespa)

本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker 卷中的 onnx 文件,并提供可落地的解决方案:将模型文件嵌入 zip 包、正确配置 schema 与 model 定义、确保资源分配充足。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker...

如何在 Vespa 中正确集成 ONNX 模型(PyVespa 教程)

本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过相对路径引用,同时提供可运行的 schema 配置与部署实践要点。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过...

如何在Python中进行地理空间数据的聚类分析_使用PySAL与Geopandas

PySAL与geopandas组合是地理感知聚类的务实选择,能尊重地球曲率、构建空间权重、识别空间自相关;sklearn直接对经纬度聚类会因纬度差异导致距离失真,结果不可解释。 PySAL 和 geopandas 的组合,是做真正地理感知聚类(而非简单把经纬度当平面坐标扔进 sklearn.DBSCAN)的务实选择。它能尊重地球曲率、处理空间权重、识别空间自相关——这些恰恰是多数教程跳过、但业务中...

如何按字符串首字母对 Pandas Series 进行分组

本文讲解如何正确使用 itertools.groupby 按字符串首字母对 pandas series 数据进行分组,重点解决未排序导致分组断裂、键对象不可读等问题,并提供更简洁、健壮的替代方案。 本文讲解如何正确使用 itertools.groupby 按字符串首字母对 pandas series 数据进行分组,重点解决未排序导致分组断裂、键对象不可读等问题,并提供更简洁、健壮的替代方案。 it...