当前位置: 首页 > 知识库问答 >
问题:

如何删除数据帧中具有特定字符的子字符串?

阳念
2023-03-14

我有一个熊猫数据框,看起来像这样:

COL

hi A/P_90890 how A/P_True A/P_/93290 are AP_wueiwo A/P_|iwoeu you A/P_?9028k ?
...
 Im  fine, what A/P_49 A/P_0.0309 about you?

预期结果应该是:

COL

hi how are you?
...
Im fine, what about you?

如何有效地从列和整个数据帧中删除具有a/P的所有字符串?

我尝试使用以下正则表达式:

A/P_(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+

然而,我不知道是否有更简单或更健壮的方法从我的数据框中删除所有这些子串。如何删除开头有A/P_的所有字符串?

更新

我试过:

df_sess['COL'] = df_sess['COL'].str.replace(r'A/P(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', '')

它是有效的,但是我想知道是否有更有效的方法。可能是一个正则表达式。

共有3个答案

谷德本
2023-03-14

因为熊猫0.23。replace()函数中存在0个错误(https://github.com/pandas-dev/pandas/issues/21159)尝试用正则表达式模式替换时,会发生以下错误:

df.COL.str.replace(regex_pat, '', regex=True)
...
--->
TypeError: Type aliases cannot be used with isinstance().

我建议使用熊猫。Series.apply函数与预编译正则表达式模式:

In [1170]: df4 = pd.DataFrame({'COL': ['hi A/P_90890 how A/P_True A/P_/93290 are AP_wueiwo A/P_|iwoeu you A/P_?9028k ?', 'Im  fine, what A/P_49 A/P_0.0309 about you?']})

In [1171]: pat = re.compile(r'\s*A/?P_[^\s]*')

In [1172]: df4['COL']= df4.COL.apply(lambda x: pat.sub('', x))

In [1173]: df4
Out[1173]: 
                         COL
0           hi how are you ?
1  Im  fine, what about you?
壤驷高旻
2023-03-14

怎么样:

(df['COL'].replace('A[/P|P][^ ]+', '', regex=True)
          .replace('\s+',' ', regex=True))

完整示例:

import pandas as pd

df = pd.DataFrame({
    'COL': 
    ["hi A/P_90890 how A/P_True A/P_/93290 AP_wueiwo A/P_|iwoeu you A/P_?9028k ?",
    "Im  fine, what A/P_49 A/P_0.0309 about you?"]
})

df['COL'] = (df['COL'].replace('A[/P|P][^ ]+', '', regex=True)
                      .replace('\s+',' ', regex=True))

返回(哦,之前还有一个额外的空间?):

                        COL
0              hi how you ?
1  Im fine, what about you?
邓开济
2023-03-14

一种方法是使用\S*匹配A/P_后面的所有非空间,并添加\s来删除要删除的字符串后面的空白,例如:

df_sess['COL'] = df_sess['col'].str.replace(r'A/P_\S*\s', '')

在你的输入中,似乎有一个错别字错误(或者至少我是这么认为的),所以对于这个输入:

df_sess = pd.DataFrame({'col':['hi A/P_90890 how A/P_True A/P_/93290 are A/P_wueiwo A/P_|iwoeu you A/P_?9028k ?',
                              'Im fine, what A/P_49 A/P_0.0309 about you?']})
print (df_sess['col'].str.replace(r'A/P_\S*\s', ''))
0            hi how are you ?
1    Im fine, what about you?
Name: col, dtype: object

您得到了预期的输出

 类似资料:
  • 问题内容: 例如,我正在从文本文件中提取文本String,我需要这些词来形成数组。但是,当我执行所有这些操作时,有些单词以逗号(,)或句号(。)结尾,甚至附有括号(这完全是正常现象)。 我要做的是摆脱那些角色。我一直在尝试使用Java中的预定义String方法来做到这一点,但我还是无法解决。 问题答案: 用: replaceAll采用正则表达式。这个: …寻找每个逗号和/或句号。

  • 问题内容: 我想删除指定字符或一组字符之前的所有字符(例如): 现在,我想删除以前的(或更具体地说是)。有什么建议? 问题答案: 使用。只需匹配所有字符,然后将匹配的字符替换为。

  • 问题内容: 仅在句点结束时,如何删除最后一个字符? 问题答案: (参考:PHP.net上的rtrim)

  • 问题内容: 我有一组字符串,并且其中的所有字符串都有两个特定的子字符串,这些子字符串是我不需要的并且想要删除。 输入示例: 所以基本上我希望从所有字符串中删除和子字符串。 我试过的 但这似乎根本不起作用。输出绝对没有变化,它与输入相同。我尝试使用原始版本,但没有任何改变。 问题答案: 字符串是不可变的。(python 2.x)或(python 3.x)创建一个 新 字符串。在文档中对此进行了说明:

  • 问题内容: 我有一个像这样的数组: 我要做的是删除“苹果”。 我的问题很基本,但是,我搜索了网站,发现java并不真正支持从数组中删除功能。我还听说过使用Java Utils,因为删除项目非常简单…。我试图在Google上找到Java Utils,但是几乎所有链接都消失了。 所以最后…有什么方法可以从字符串数组中删除字符串? 即使我使用ArrayList,也找不到在其中生成随机项的方法!例如:在普

  • 问题内容: 我想删除特殊字符,例如: 使用Java从String中获取。 问题答案: 这取决于你定义为特殊字符的内容,但是请尝试: 请注意,该^字符不能是列表中的第一个字符,因为你要么必须对其进行转义,否则将意味着“除这些字符外的任何字符”。 另一个注意事项:-字符必须是列表中的第一个或最后一个,否则你必须对其进行转义,否则它将定义一个范围(例如,表示“ 范围内的所有字符” )。 所以,为了保持一