You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas按条件修改DataFrame列实现+号拼接与移除的方法

Pandas 列修改逻辑修正方案

原有代码的核心逻辑错误

  • Vitamins列赋值逻辑完全错位:错误使用str()将筛选出的目标子列转为包含行号、列名的整体表格字符串再拼接+,同时直接对整列赋值,最终会把所有行的Vitamins值都覆盖为这段长文本,根本达不到逐行给符合条件的维生素值末尾拼接加号的效果。
  • Sign列赋值范围错误:处理后的值没有用.loc定位到目标行再写入,而是直接将整列Sign替换为mask筛选出的子列的处理结果,会导致所有不符合mask条件的行的原有Sign值(比如第一行的-、第四行的数值2、第六行的Expired)被意外覆盖为NaN,完全保留不了非目标行的原始内容。
  • Sign列处理细节缺失:仅做了加号移除,没有处理两个细节:一是移除加号后残留的首尾空格(比如原值为+ Severe Cases的条目,移除加号后会带前导空格);二是原本为纯加号的条目,移除加号后会得到空字符串,需要按照预期转换为NaN。

修正后的可运行代码

import pandas as pd
import numpy as np

data = {'Vitamins': ['B', 'C', 'A', 'Z', 'E', 'I', 'D', 'K', 'J'],
       'Sign': ['-', '+', np.nan, 2, '+', 'Expired', '+ Severe Cases', 'Expired+ Last Year', '+New']}
df = pd.DataFrame(data, columns=['Vitamins', 'Sign'])

# 筛选Sign列包含'+'的行,先转字符串兼容列内的整数、NaN类型,避免类型警告
mask = df['Sign'].astype(str).str.contains('+', na=False, regex=False)

# 仅定位目标行,逐行给Vitamins值末尾拼接'+'
df.loc[mask, 'Vitamins'] = df.loc[mask, 'Vitamins'] + '+'

# 处理目标行的Sign列:移除'+'、清理首尾空格、将空字符串替换为NaN
processed_sign = df.loc[mask, 'Sign'].str.replace('+', '', regex=False).str.strip()
processed_sign = processed_sign.replace('', np.nan)
df.loc[mask, 'Sign'] = processed_sign

运行后输出效果

执行上述代码得到的DataFrame完全匹配预期处理效果:

Vitamins       Sign
0        B          -
1       C+        NaN
2        A        NaN
3        Z          2
4       E+        NaN
5        I    Expired
6        D  Severe Cases
7       K+  Expired Last Year
8       J+        New

内容的提问来源于stack exchange,提问作者D. F. R. 123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 06:54:02