如何从数据框列中的某些行中删除字符?

sam*_*sam 12 python regex dataframe pandas data-cleaning

我有一个需要清理的大型数据框,作为示例,请查看此数据框

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'])

print (df)
Run Code Online (Sandbox Code Playgroud)

我想从单词的末尾删除 '.T',并且只删除 '.' 从包含 的行的开头。

通过以下代码行,我可以删除“.T”

df['Price'].replace('.T', '', regex=True)
Run Code Online (Sandbox Code Playgroud)

但它也从“.TPX”中删除了“T”

对此的任何建议表示赞赏。

0    22000
1    25000
2    27000
3       PX
4    .NKM1
Name: Price, dtype: object
Run Code Online (Sandbox Code Playgroud)

也用于删除“。”,当我添加这一行时

f['Price'].replace('.', '', regex=True)
Run Code Online (Sandbox Code Playgroud)

我得到了与预期不同的数据框

0    
1    
2    
3    
4    
Name: Price, dtype: object
Run Code Online (Sandbox Code Playgroud)

sop*_*les 8

另一种方法是使用numpy.where,并使用满足您的条件str.startswithstr.endswith

import numpy as np

p = df['Price'].str
df['Price'] = np.where(p.startswith('.'),p.replace('.','',regex=True),
                         np.where(p.endswith('.T'),p.replace('.T','',regex=True),p))
Run Code Online (Sandbox Code Playgroud)
            Brand  Price
0     Honda Civic  22000
1  Toyota Corolla  25000
2      Ford Focus  27000
3         Audi A4    TPX
4          Suzuki   NKM1
Run Code Online (Sandbox Code Playgroud)


Shu*_*rma 6

Series.str.replace

df['Price'] = df['Price'].str.replace(r'^(?:\.)?(.*?)(?:\.T)?$', r'\g<1>')
Run Code Online (Sandbox Code Playgroud)

Series.str.extract

df['Price'] = df['Price'].str.extract(r'^(?:\.)?(.*?)(?:\.T)?$', expand=False)
Run Code Online (Sandbox Code Playgroud)
            Brand  Price
0     Honda Civic  22000
1  Toyota Corolla  25000
2      Ford Focus  27000
3         Audi A4    TPX
4          Suzuki   NKM1
Run Code Online (Sandbox Code Playgroud)

正则表达式详细信息:

  • ^ : 在行首断言位置
  • (?:\.) : 匹配字符的非捕获组 .
  • ? : 匹配前一个非捕获组零次或一次
  • (.*?): 捕获匹配除行终止符以外的任何字符零次或多次但尽可能少的组 ( lazy match)
  • (?:\.T) : 匹配的非捕获组 .T
  • ? : 匹配前一个非捕获组零次或一次
  • $ : 断言行尾的位置

Regex demo