pandas 替换(擦除)字符串中的不同字符

Posted

技术标签:

【中文标题】pandas 替换(擦除)字符串中的不同字符【英文标题】:pandas replace (erase) different characters from strings 【发布时间】:2016-01-14 10:46:27 【问题描述】:

我有一份高中名单。我想从字符串中删除某些字符、单词和符号。

我目前有:

df['schoolname'] = df['schoolname'].str.replace('high', "")

但是,我想使用一个列表,以便快速替换 highschool/ 等。

有什么建议吗?

df['schoolname'] = df['schoolname'].str.replace(['high', 'school'], "") 

没用

【问题讨论】:

你能用 for 循环包裹你的 replace() 吗? @chrisaycock 我想过,但这似乎是一种解决方法。必须遍历整个数组 x 次,而不是在查找任何字符时遍历它 【参考方案1】:

我的问题:我想找到一个简单的解决方案,使用 pandas 的 replace 方法删除字符/符号。

我在数据框中有以下数组:

  df = array(['2012', '2016', '2011', '2013', '2015', '2017', '2001', '2007',
   '[2005], ©2004.', '2005', '2009', '2008', '2009, c2008.', '2006',
   '2019', '[2003]', '2018', '2012, c2011.', '[2012]', 'c2012.',
   '2014', '2002', 'c2005.', '[2000]', 'c2000.', '2010',
   '2008, c2007.', '2011, c2010.', '2011, ©2002.', 'c2011.', '[2017]',
   'c1996.', '[2018]', '[2019]', '[2011]', '2000', '2000, c1995.',
   '[2004]', '2005, ©2004.', 'c2004.', '[2009]', 'c2009.', '[2014]',
   '1999', '[2010]', 'c2010.', '[2006]', '2007, 2006.', '[2013]',
   'c2001.', 'C2016.', '2008, c2006.', '2011, ©2010.', '2007, c2005.',
   '2009, c2005.', 'c2002.', '[2004], c2003.', '2009, c2007.', '2003',
   '©2003.', '[2016]', '[2001]', '2010, c2001.', '[1998]', 'c1998.'],
  dtype=object)

如您所见,输入年份使用多种格式(啊!),带有括号和版权符号以及小写 c 和大写 C。

现在我想删除那些不需要的字符,并且只有四位数的年份。由于它是一个数组,所以在使用replace()之前还需要将其转换为字符串。创建一个包含所有要替换的字符的变量,并用 ' | 分隔它们。 '。

rep_chars = 'c|C|\]|\[|©|\.'

df[Year] = df['Year'].str.replace(rep_chars,"")

确保使用\. 而不仅仅是句号。 \]\[ 也是如此。

输出:

array(['2012', '2016', '2011', '2013', '2015', '2017', '2001', '2007',
   '2005, 2004', '2005', '2009', '2008', '2009, 2008', '2006', '2019',
   '2003', '2018', '2012, 2011', '2014', '2002', '2000', '2010',
   '2008, 2007', '2011, 2010', '2011, 2002', '1996', '2000, 1995',
   '2004', '1999', '2007, 2006', '2008, 2006', '2007, 2005',
   '2009, 2005', '2004, 2003', '2009, 2007', '2010, 2001', '1998'],
  dtype=object)

数据清理愉快!

【讨论】:

【参考方案2】:

你可以创建一个字典然后.replace(, regex=True)方法:

replacements = 
   'schoolname': 
      r'(high|school)': ''


df.replace(replacements, regex=True, inplace=True)

【讨论】:

【参考方案3】:

使用正则表达式(用|分隔字符串):

df['schoolname'] = df['schoolname'].str.replace('high|school', "")

【讨论】:

哦。唔。我尝试了df['schoolname'] = df['schoolname'].str.replace('high| hig| schools|school|schoo| scho| sch| sc|@|/|-|h s| hs|.|"', ""),但是我最终得到了一个空列。我是不是做错了什么? @As3adTintin dot 是一个特殊的正则表达式字符(可以捕获所有字符),您必须使用 \. 对其进行转义 它比 for 循环更快更高效。

以上是关于pandas 替换(擦除)字符串中的不同字符的主要内容,如果未能解决你的问题,请参考以下文章

使用字典替换 Pandas 列中字符串中的字符串

用 Pandas 中的一个字符串替换一个字符串

用一个值替换 Pandas 系列中的多个子字符串

用字典值替换 Pandas Dataframe 中的部分字符串

python pandas用数字替换数据框中的字符串

字符串中的 Pyspark 双字符替换避免某些单词而不映射到 pandas 或 rdd