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)
另一种方法是使用numpy.where,并使用满足您的条件str.startswith和str.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)
Series.str.replacedf['Price'] = df['Price'].str.replace(r'^(?:\.)?(.*?)(?:\.T)?$', r'\g<1>')
Run Code Online (Sandbox Code Playgroud)
Series.str.extractdf['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? : 匹配前一个非捕获组零次或一次$ : 断言行尾的位置| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |