【问题标题】:ValueError: Columns must be same length as key with multiple outputsValueError:列的长度必须与具有多个输出的键的长度相同
【发布时间】:2022-01-23 01:58:24
【问题描述】:

我正在从 Excel 单元格中提取一个子字符串,整个字符串显示如下:

The bolts are 5" long each and 3" apart

我想提取螺栓的长度为5"。我使用下面的代码来得到它

df['Bolt_Length'] = df['Description'].str.extract(r'(\s[0-9]")',expand=False)

但如果字符串显示以下内容:

The bolts are 10" long each and 3" apart

我尝试使用以下代码:

df['Bolt_Length'] = df['Description'].str.extract(r'(\s(\d{1,2})")',expand=False)

我收到以下错误消息:

ValueError: Columns must be same length as key

我认为 Python 不知道要获取哪个数字。 10"3"

我该如何解决这个问题?如何告诉 Python 只选择第一个 "

另一方面,如果我想同时获得螺栓长度和与另一个螺栓的距离怎么办?如何同时提取两者?

【问题讨论】:

    标签: python excel regex pandas


    【解决方案1】:

    发生错误是因为您的正则表达式包含 two 捕获组,它们提取 two 列值,但您将它们分配给 single 列, df['Bolt_Length'].

    您需要在正则表达式模式中使用与您分配值的列一样多的捕获组

    df['Bolt_Length'] = df['Description'].str.extract(r'\s(\d{1,2})"',expand=False)
    

    \s(\d{1,2})" 正则表达式仅包含一对未转义的括号,它们构成一个捕获组,因此这可以正常工作,因为该单个值被分配给单个 Bolt_Length 列。

    【讨论】:

      【解决方案2】:

      您的问题是您的第二个正则表达式(\s(\d{1,2})") 中有两个捕获组,而不是一个。所以基本上,你是在告诉 Python 得到数字 with "and 相同的数字 without ":

      >>> df['Description'].str.extract(r'(\s(\d{1,2})")', expand=False)
            0   1
      0    5"   5
      1   10"  10
      

      您可以在组的左括号之后添加?:,使其不会捕获任何内容,尽管它仍然作为一个组起作用。以下内容使得不包括" 的内部组不捕获:

      #                                notice vv
      >>> df['Description'].str.extract(r'(\s(?:\d{1,2})")', expand=False)
      0      5"
      1     10"
      Name: Description, dtype: object
      

      【讨论】:

        猜你喜欢
        • 2019-02-24
        • 1970-01-01
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2018-11-04
        相关资源
        最近更新 更多