【问题标题】:Replacing dataframe column values from a re.search loop从 re.search 循环替换数据框列值
【发布时间】:2020-07-12 20:43:32
【问题描述】:

如何将现有数据框列的值替换为 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

【问题讨论】:

  • 你的预期输出是什么?
  • 年 col1 1 2001 10.563 2 2002 9.540 3 2003 4.674 4 2004 3.2754 5 2005 nan
  • 基本去掉\和字母:)

标签: python regex pandas


【解决方案1】:

您可以使用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 代替它?还是我理解的代码正确?
  • @Lara \1 只是一种引用模式中第一个捕获组的方法,(.*?) 代表您要保留的数据。
【解决方案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]

【讨论】:

    【解决方案3】:

    您可以使用 pandas str extract,带有前瞻断言 - 它只会保留“\”之前的项目

      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
    

    【讨论】:

      【解决方案4】:

      在这种情况下,我会使用split 函数而不是更长的正则表达式模式:

      dataset['col1'] = dataset['col1'].str.split('\\').str[0]
      

      或者,将split转换成float数据类型:

      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
      

      【讨论】:

      • 谢谢!我也可以使用它,但是如何在拆分后使 str 变为浮动?
      • @lara,如果这对你有用,请告诉我。此外,您一定不要忘记欣赏他人的努力。通过支持信息丰富且有用的答案和/或接受解决您的问题的答案。
      • 是的,现在刚刚尝试过,效果很好。谢谢您的帮助! :)
      猜你喜欢
      • 2021-02-26
      • 2021-07-08
      • 2019-12-16
      • 2023-03-11
      • 2020-03-01
      • 1970-01-01
      • 2021-10-22
      • 2018-01-31
      • 2014-11-12
      相关资源
      最近更新 更多