如何在Pandas DataFrame列中针对性删除部分行的指定字符?
解决Pandas DataFrame Price列的字符清洗问题
我来帮你搞定这个数据清洗的小麻烦!你遇到的问题核心是正则表达式没有加上位置锚点,导致匹配范围超出了你预期的范围,咱们一步步来修正:
问题分析
- 你最初用
df['Price'].replace('.T', '', regex=True)时,正则里的.是特殊字符,会匹配任意单个字符,而且没有限定匹配位置,所以它把.TPX里的.T也一起替换掉了,才得到了PX。 - 后来用
replace('.', '', regex=True)时,.匹配了所有字符,自然把整个列的内容都清空了——这是因为.在正则中代表任意单个字符,必须转义成\.才能匹配真正的点号。
正确解决方案
我们需要用带位置锚点的正则表达式来精准匹配目标字符:
- 用
^\.匹配字符串开头的点号(^表示行首) - 用
\.T$匹配字符串末尾的.T($表示行尾,\.转义点号避免它成为通配符)
你可以把两个规则合并成一次操作,也可以分步骤处理,两种方式都能得到预期结果:
方式一:合并正则规则一次处理
import pandas as pd cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4','Suzuki'], 'Price': ['22000.T','25000.T','27000','.TPX','.NKM1'] } df = pd.DataFrame(cars, columns = ['Brand', 'Price']) # 用正则同时匹配开头的点和末尾的.T df['Price'] = df['Price'].replace(r'^\.|(?<=\d)\.T$', '', regex=True) print(df)
这里的(?<=\d)\.T$是额外加了个正向断言,确保.T前面是数字,避免误删其他位置的.T(比如如果有类似abc.Tdef的内容不会被误处理)。
方式二:分步骤处理(更直观)
import pandas as pd cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4','Suzuki'], 'Price': ['22000.T','25000.T','27000','.TPX','.NKM1'] } df = pd.DataFrame(cars, columns = ['Brand', 'Price']) # 第一步:删除末尾的.T df['Price'] = df['Price'].str.replace(r'\.T$', '', regex=True) # 第二步:删除开头的. df['Price'] = df['Price'].str.replace(r'^\.', '', regex=True) print(df)
最终输出结果
两种方式都会得到你想要的清洗后数据:
Brand Price 0 Honda Civic 22000 1 Toyota Corolla 25000 2 Ford Focus 27000 3 Audi A4 TPX 4 Suzuki NKM1
内容的提问来源于stack exchange,提问作者sam_sam
相关产品推荐
相关产品推荐

