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