【问题标题】:How to find rows in Pandas dataframe where re.search fails如何在 Pandas 数据框中查找 re.search 失败的行
【发布时间】:2019-12-13 18:12:16
【问题描述】:

我正在尝试使用以下格式从 Metar 字符串中提取风向:

EGAA 010020Z 33004KT 300V010 9999 FEW029 04/04 Q1019

我正在使用它来提取风向,这适用于我的大部分数据,但在某些字符串上失败:

df["Wind_Dir"] = df.metar.apply(lambda x: int(re.search(r"\s\d*KT\s", metar_data.metar[0]).group().strip()[:3]))

我想检查它失败的 Metar 字符串,所以我没有将 group()re.search 中拉出来,而是按如下方式应用搜索以获取 re.Match 对象:

df["Wind_Dir"] = df.metar.apply(lambda x: re.search(r"\s\d*KT\s", x))

我尝试过按类型和 Null 进行过滤,但这些都不起作用。

任何帮助将不胜感激。


很遗憾,感谢您的回答,尽管我使用两者来解决我的问题,但我无法将它们都标记为解决方案。

最后我将正则表达式更改为:

df["Wind_Dir"] = df.metar.str.findall(r"Z\s\d\d\d|Z\sVRB")

匹配可变方向,但如果没有df.metar.str.contains(),将无法找到它。

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    您正在搜索这个: pandas.Series.str.contains 为与基于re.search 的模式匹配的索引返回一个带有 True 的掩码。

    正如 Pandas 文档所述,如果您想要基于 re.match 的掩码,您应该使用:pandas.Series.str.match

    您还可以使用以下内容: pandas.Series.str.extract 在您执行分析的系列的每一行上提取模式的第一个匹配项。 NaN 将填充不包含该模式的行,因此您可以获取 Nan 值来检索这些行。

    【讨论】:

      【解决方案2】:

      您需要您的代码返回匹配的字符串而不是 re 对象。

      当没有匹配时这也不起作用,因为 re.search 不会返回任何东西。

      试试pandas.series.str.findall

      在你的情况下试试这个

      df['Wind_Dir'] = df.metar.str.findall(r"\s\d*KT\s")
      df["Wind_Dir"] = df['Wind_Dir'].apply(lambda x: x[0].strip()[:3])
      

      您可能还想在执行第二条语句之前检查是否存在匹配项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2021-09-23
        • 2017-01-31
        • 2019-05-21
        • 1970-01-01
        相关资源
        最近更新 更多