You need to enable JavaScript to run this app. 按列所属分类与数值正负修改pandas DataFrame内容的Python实现
优惠活动
大模型
产品
解决方案
定价
更多

按列所属分类与数值正负修改pandas DataFrame内容的Python实现

适配Google Colab最新Python/Pandas环境的高效实现方案

实现逻辑

全程采用pandas/numpy的向量化操作,不做逐行循环,小数据量代码简洁易改,大数据量也能保证运行效率,完全匹配提出的转换规则:

  • 第一步提前维护列名与分类的映射关系,避免硬编码分类
  • 对值为0的单元格直接保留原值
  • 对非零单元格先提取正负号,再拼接对应列所属分类,生成[符号]cat [分类名]格式的字符串

可直接复制到Colab运行的代码

首先构造描述结构的原始DataFrame,后续可以直接替换成实际读取的数据源:

import pandas as pd
import numpy as np

# 生成题目中描述结构的初始DataFrame
df = pd.DataFrame(
    data=[[-0.1, 0, 0.2, 0, 4],
          [0, 0, -1, -2, 5]],
    columns=["A", "B", "C", "D", "E"]
)

# 定义列与分类的映射规则,后续修改分类直接调整这个字典即可
col_category_map = {"A": "X", "B": "X", "C": "Y", "D": "Y", "E": "Y"}

# 生成和原DataFrame同形状的分类矩阵,每个单元格填充所属列的分类名
category_grid = pd.DataFrame(
    {col: [cat] * len(df) for col, cat in col_category_map.items()}
)

# 逐元素提取符号:非零值按正负映射为+/-字符串,零值暂时保留占位
sign_grid = df.map(lambda x: "+" if x > 0 else ("-" if x < 0 else 0))

# 按规则拼接最终结果
result_df = pd.DataFrame(
    np.where(
        df == 0,  # 判断单元格是否为0
        0,  # 为0则直接保留原值
        sign_grid + "cat " + category_grid  # 非零值则拼接成要求的字符串格式
    ),
    columns=df.columns,
    index=df.index
)

输出验证

运行上述代码后得到的result_df和描述的预期输出完全一致:

ABCDE
-cat X0+cat Y0+cat Y
00-cat Y-cat Y+cat Y

方案优势

  • 完全适配Colab当前内置的最新版pandas(无版本兼容问题,采用pandas 2.1+推荐的逐元素map操作,替代旧版效率较低的applymap)
  • 分类规则集中在字典配置项,后续如果调整列的所属分类,不需要修改核心转换逻辑
  • 全流程向量化运算,即使后续DataFrame行数从2行涨到几万行,运行速度也不会有明显下降,比逐行iterrows或apply的实现效率高一个量级

内容的提问来源于stack exchange,提问作者Pushkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 16:15:05