按列所属分类与数值正负修改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和描述的预期输出完全一致:
| A | B | C | D | E |
|---|---|---|---|---|
| -cat X | 0 | +cat Y | 0 | +cat Y |
| 0 | 0 | -cat Y | -cat Y | +cat Y |
方案优势
- 完全适配Colab当前内置的最新版pandas(无版本兼容问题,采用pandas 2.1+推荐的逐元素
map操作,替代旧版效率较低的applymap) - 分类规则集中在字典配置项,后续如果调整列的所属分类,不需要修改核心转换逻辑
- 全流程向量化运算,即使后续DataFrame行数从2行涨到几万行,运行速度也不会有明显下降,比逐行
iterrows或apply的实现效率高一个量级
内容的提问来源于stack exchange,提问作者Pushkar
相关产品推荐
相关产品推荐

