如何移除pandas DataFrame列字符串首尾空格避免get_dummies生成重复列
问题根源
你写的strip_string函数存在两个核心问题,导致空格清理完全没生效:
- 循环里仅把
strip()处理后的结果赋值给了临时变量a,从来没有把处理后的值写回原DataFrame的对应位置,原列数据根本没被修改 - 就算你把值写回了,
strip()只会处理整个单元格字符串的首尾空格,没法清理逗号分隔符前后的内部空格(比如df, gh里逗号后面跟的空格),最终get_dummies()会把gh和gh识别成两个不同的分类,才会出现重复列。
可行解决方案
pandas自带的字符串向量化方法不需要写逐行循环,就能高效完成空格清理,处理后再做独热编码就不会出现重复列。
方法1:拆分-清理-拼接(逻辑直观易读)
先按逗号拆分每个单元格的字符串,给拆分出来的每一个分类项单独去掉首尾空格,再重新用逗号拼接成完整字符串,之后再做独热编码:
import pandas as pd # 初始化DataFrame(注意原代码里df是字典,需要转成pandas的DataFrame结构才能调用后续方法) df = pd.DataFrame({ 'c1': [' ab', 'fg', 'ac ', 'hj-jk ', ' ac', 'df, gh', 'gh', 'ab', 'ad', 'jk-pl', 'ae', 'kl-kl '], 'b2': ['ba', 'bc', 'bd', 'be', 'be', 'be', 'ba', 'bc', 'bd', 'be', 'ba', 'bc'] }) # 清理c1列所有分类项的首尾空格 df['c1'] = df['c1'].str.split(',').apply(lambda item_list: [single_item.strip() for single_item in item_list]).str.join(',') # 生成独热编码 df1 = df['c1'].str.get_dummies(',')
方法2:正则替换(代码更简洁,运行效率更高)
直接用正则匹配逗号前后所有空白字符替换成纯逗号,再处理整个字符串首尾的空格,一步完成清理:
# 正则替换逗号前后的空白,同时清理字符串首尾空格 df['c1'] = df['c1'].str.replace(r'\s*,\s*', ',', regex=True).str.strip() df1 = df['c1'].str.get_dummies(',')
两种方法处理后,原本带空格的同名分类会被统一(比如 ab、ab统一为ab,ac 、 ac统一为ac, gh和gh统一为gh),最终生成的独热编码不会再出现重复列。
内容的提问来源于stack exchange,提问作者Natália Resende
相关产品推荐
相关产品推荐

