在系列上应用Re模块时遇到问题

时间:2018-06-13 16:52:45

标签: python

我无法将以下内容应用到我的系列中。

 Data['Notes']
 0       2018-06-07 09:38:14Z -- legal -- As per ...
 1       2018-06-05 12:48:26Z -- name -- Holdin...
 2       2018-06-05 17:15:48Z -- filing -- Answe...
 3       2018-06-11 08:34:53Z -- name -- lvm i...
 4       2018-05-11 08:31:26Z -- filed -- summo...
 5       2018-06-01 16:07:11Z -- Name Rogers -- sent ...

import re

keywords = {'file', 'filing', 'legal'}
max_words_after  = 5

key_re = re.compile(fr"""
(?:{'|'.join([w for w in keywords])})   #keyword options group
\s((?:[\s]?[A-Za-z\']+[\s]?)    #capture word. include with line-breaks
{{1,{max_words_after}}})                #1 to max_words_after
""", re.VERBOSE|re.IGNORECASE
)

for f in data['Notes']:
data['Result'] = key_re.findall(f)

作为回应,我得到的只是

  

“ValueError:值的长度与索引的长度不匹配。”

请告诉我如何获得每个索引位置的结果并将其附加到数据框中的新系列。

1 个答案:

答案 0 :(得分:0)

了解您的错误

key_re.findall(f)返回不同大小的列表(我认为会找到0或1个关键字,但取决于你的re表达式,它可能更多)。

您正在向所有行广播这是您的数据框架当然没有相同数量的项目。因此"值的长度与索引的长度不匹配。"

我不认为这是你想要做的事情。我想你想根据另一列创建一个新列。有关详细信息,请参阅this question,但此处适用于您的具体情况。

修复代码

import re
import pandas as pd

这是我在寻找有关您的Data变量的内容。我可以复制,粘贴和运行的东西:

Data = pd.DataFrame([["2018-06-07 09:38:14Z -- legal -- As per ..."],["2018-06-05 12:48:26Z -- name -- Holdin..."]], columns=["Notes"])

创建一个执行所需转换的函数。

def find_key_words(row):
    keywords = {'file', 'filing', 'legal'}
    max_words_after  = 5

我只包括你re表达式的第一行,因为当我测试它时,当我在那里完整表达时,我总是没有结果。您可以根据需要进行修改。

    key_re = re.compile(fr"""
        (?:{'|'.join([w for w in keywords])})   #keyword options group
        """, re.VERBOSE|re.IGNORECASE
    )
    return key_re.findall(row['Notes'])

现在将该功能应用于每一行。这样,您就可以播放与数据['结果']期望的长度匹配的内容。

Data['Result'] = Data.apply(lambda row: find_key_words(row),axis=1)