Python 如何从数据帧列中的某些行中删除字符?
我有一个大的数据框,我需要清理,作为一个样本,请看看这个数据框Python 如何从数据帧列中的某些行中删除字符?,python,regex,pandas,dataframe,data-cleaning,Python,Regex,Pandas,Dataframe,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
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)
我想从单词的末尾删除“.T”,只从包含单词的行的开头删除“.”
通过以下代码行,我可以删除“.T”
df['Price'].replace('.T', '', regex=True)
但它也从“.TPX”中删除了“T”
任何关于这方面的建议都将不胜感激
0 22000
1 25000
2 27000
3 PX
4 .NKM1
Name: Price, dtype: object
也用于在添加此行时删除“.”
f['Price'].replace('.', '', regex=True)
我得到了与预期不同的数据帧
0
1
2
3
4
Name: Price, dtype: object
Series.str.replace
正则表达式详细信息:
:在行首断言位置^
:与字符匹配的非捕获组(?:\)
:与以前的非捕获组零次或一次匹配?
:捕获与除行终止符以外的任何字符匹配的组,零次或多次,但次数尽可能少((.*)
)延迟匹配
:匹配(?:\.T)
.T
:与以前的非捕获组零次或一次匹配?
:断言行末尾的位置$
请参见我想解释一下为什么会得到这个结果。这是因为
在模式中使用时具有特殊意义,特殊字符列表以开头
(点。)在默认模式下,它匹配除字符外的任何字符
新线。如果指定了DOTALL
标志,则该标志与任何
包含换行符的字符
所以,当你说文字>代码> <代码>时,你需要跳过它,考虑下面的例子
df = pd.DataFrame({"col1":["3.45"]})
df["unescaped"] = df.col1.replace(r'.','X',regex=True)
df["escaped"] = df.col1.replace(r'\.','X',regex=True)
print(df)
输出
col1 unescaped escaped
0 3.45 XXXX 3X45
请注意,我在这里使用了所谓的原始字符串,它允许以更可读的形式转义模式中具有特殊含义的字符(如果没有原始字符串,我将不得不编写
'\\.
,有关详细信息,请参阅re
文档)。如果您在正则表达式模式方面遇到困难,我建议您使用以获得其解释。另一种方法是使用,并使用and满足您的条件:
你应该能够通过锚定和所谓的积极回顾来实现你想要的
df['Price'].替换('(?您还可以使用:
您可以在字符串的开头匹配一个点,也可以在结尾匹配.T
。然后在替换中使用空字符串
\A\.|\.T\Z
比如说
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'])
df['Price'] = df['Price'].replace(r"\A\.|\.T\Z", "", 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
使用
>>df['Price'].str.replace(r'^\.\124;\.T$,'',regex=True)
0 22000
1 25000
2 27000
3 TPX
4 NKM1
看
解释
--------------------------------------------------------------------------------
^字符串的开头
--------------------------------------------------------------------------------
\. '.'
--------------------------------------------------------------------------------
|或
--------------------------------------------------------------------------------
\. '.'
--------------------------------------------------------------------------------
没有
--------------------------------------------------------------------------------
$在可选的前\n和
一串
< /代码> @ ANKY,因为它也会在开始和结束时删除不需要的字符。考虑虚构的单词<代码> ABCDDTT.T >代码>,因此使用<代码> .Rabl(.t)
将导致ABCDD
,这意味着它还将在最后删除额外的T,这可能是不需要的…尽管如果这不是数据集中的问题,那么我们肯定可以使用rstrip。
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))
Brand Price
0 Honda Civic 22000
1 Toyota Corolla 25000
2 Ford Focus 27000
3 Audi A4 TPX
4 Suzuki NKM1
In [178]: import numpy as np
In [179]: conds = [df.Price.str.endswith('.T'), df.Price.str.startswith('.')]
In [182]: choices = [df.Price.str.replace('.T', '', regex=True), df.Price.str.replace('.', '', regex=True)]
In [189]: df.Price = np.select(conds, choices, default=df.Price)
In [190]: df
Out[190]:
Brand Price
0 Honda Civic 22000
1 Toyota Corolla 25000
2 Ford Focus 27000
3 Audi A4 TPX
4 Suzuki NKM1
\A\.|\.T\Z
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'])
df['Price'] = df['Price'].replace(r"\A\.|\.T\Z", "", 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