
本文介绍一种简洁高效的方法,利用 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 协同范式。

















