使用 re.search 循环替换 dataframe 列值

3

我如何用re.search循环中的值替换现有数据框列中的值?

以下是我的re.search循环:

for i in dataset['col1']:
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    print(clean.group())    

这是示例数据集(dataset)

    year    col1
1    2001    10.563\D
2    2002    9.540\A
3    2003    4.674\G
4    2004    3.2754\u
5    2005    nan\x

你期望的输出是什么? - Abdul Niyas P M
年份 列1 1 2001 10.563 2 2002 9.540 3 2003 4.674 4 2004 3.2754 5 2005 无效值 - Yel
基本上刪除 \ 和字母 :),將以下與程式設計相關的內容翻譯成中文。 - Yel
4个回答

3
你可以使用 Series.apply 将自定义函数应用于 dataset["col1"]。或者更好的方法是使用 Series.str.replace 将模式替换为替换字符串。
尝试一下:
def func(i):
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    return clean.group()

dataset["col1"] = dataset["col1"].apply(func)

或者更好的是,

df["col1"] = df["col1"].str.replace(r'(.*?)(\\.*?$)', r"\1")

输出:

>>> print(dataset)

   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan

非常感谢!我想了解你分享的第二段代码。为什么要用\1替换它?或者我理解代码是正确的吗? - Yel
@Lara \1 只是引用模式中的第一个捕获组的一种方式,该捕获组表示您想要保留的数据,其模式为 (.*?) - Shubham Sharma

2
您可以使用Pandas的str extract方法,结合前瞻断言,它将仅保留'\'之前的内容。请参考Pandas官方文档了解更多信息。
  df['cleaned'] = df["col1"].str.extract(r'(.*(?=\\))')

     year   col1        cleaned
1   2001    10.563\D    10.563
2   2002    9.540\A     9.540
3   2003    4.674\G     4.674
4   2004    3.2754\u    3.2754
5   2005    nan\x       nan

2
我会在这种情况下使用`split`函数而不是较长的正则表达式模式:
dataset['col1'] = dataset['col1'].str.split('\\').str[0]

或者,将其拆分浮点型数据类型:
dataset['col1'] = dataset['col1'].str.split('\\').str[0].astype(float)

这将直接转换这些值,不会出现错误。如果存在反斜杠,则始终从结果数组中取第一个元素。
结果:
   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan

谢谢!我也可以使用这个,但是分割后如何将字符串转换为浮点数? - Yel
@lara,如果这对你有用,请告诉我。同时,你不能忘记感激他人的努力。可以通过点赞有用的回答和/或接受解决你问题的答案来表达感激之情。 - JvdV
是的,我刚刚尝试了一下,它运行得很好。谢谢你的帮助! :) - Yel

2
使用你的方法:
dataset["col1"] = dataset["col1"].apply(lambda x: re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', x).group())

尽管个人而言,我会这样做:
dataset["col1"] = dataset["col1"].str[:-2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接