如何在 Pandas DataFrame 中删除单元格并右移数据

如何在 Pandas DataFrame 中删除单元格并右移数据

本文详解如何识别特定模式的单元格(如列 p 中以 “dis” 开头的值),将其置空,并将原值整体右移一列,同时自动扩展新列(如 s)填充移入内容,最终实现“剪切-右移-对齐”效果。

在 Pandas 中,没有直接等价于 Excel “剪切单元格并右移” 的原生操作,但可通过逻辑拆解+向量操作高效模拟该行为:核心思路是——定位需移动的行 → 将其整行向右平移一列 → 与未移动行拼接 → 统一补齐缺失值

以下为完整实现步骤与代码:

Memories.ai

Memories.ai

专注于视频解析的AI视觉记忆模型

下载

✅ 步骤解析

  1. 新增目标列 S:初始化为 ‘blank’(或 np.nan,后续统一填充);
  2. 构造布尔条件:df[‘P’].str.startswith(‘Dis’) 精准匹配需右移的行;
  3. 分离处理

    • df[~cond]:保留原结构(P 列不以 “Dis” 开头的行);
    • df[cond].shift(axis=1):对匹配行执行按列右移(即 P→Q, Q→R, R→S,原 P 变为 NaN);
  4. 合并与对齐:用 pd.concat() 垂直拼接两部分,再通过 sort_index() 恢复原始行序;
  5. 填充空值:fillna(‘blank’) 将所有 NaN 替换为指定占位符。

? 完整可运行代码

import pandas as pd
import numpy as np

# 构造示例数据
data = {
    'P': ['Performan', 'Dispo', 'Perfumo', 'Disper', 'Dispite'],
    'Q': ['Dispite', 'camera', 'Displu', 'camera', 'camera'],
    'R': ['Cammmr', 'battery', 'Cammmmt', 'battery', 'battery']
}
df = pd.DataFrame(data)

# 实现“剪切P中Dis开头值并右移”
df['S'] = 'blank'  # 新增列
cond = df['P'].str.startswith('Dis')
out = (
    pd.concat([df[~cond], df[cond].shift(axis=1)])
    .fillna('blank')
    .sort_index()
    .reindex(columns=['P', 'Q', 'R', 'S'])  # 显式指定列序,确保S在末尾
)

print(out)

? 输出结果

           P        Q        R        S
0  Performan  Dispite   Cammmr    blank
1      blank    Dispo   camera  battery
2    Perfumo   Displu  Cammmmt    blank
3      blank   Disper   camera  battery
4      blank  Dispite   camera  battery

⚠️ 注意事项

  • shift(axis=1) 是向右平移(列方向),会丢失最右侧列的值(本例中 R 值移入 S,原 S 无来源故为 NaN);
  • 若需保留原始列名语义(如移入后 S 应代表原 P 内容),建议后续重命名列或添加注释;
  • fillna() 使用 ‘blank’ 字符串时,注意其类型为 object;若后续需数值计算,应改用 np.nan 并配合 pd.isna() 判断;
  • 大数据集,该方法时间复杂度为 O(n),优于逐行循环,符合 Pandas 向量化设计哲学。

通过这一组合操作,你就能在 Pandas 中优雅复现 Excel 的“删除单元格并右移”逻辑,兼顾性能与可读性。

https://www.php.cn/faq/2019274.html

发表回复

Your email address will not be published. Required fields are marked *