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
相关产品推荐
相关产品推荐

