Python x、 findall函数返回一个值,但不返回';不写入数据帧

Python x、 findall函数返回一个值,但不返回';不写入数据帧,python,pandas,nlp,dataframe,nltk,Python,Pandas,Nlp,Dataframe,Nltk,我创建了一个函数,用于搜索NLTK.text.text对象,并在运行该函数时返回一个值 更新:问题似乎是在下面的函数中,“捐赠”变量实际上没有被传递一个值。但是,text.findall函数确实返回一个值,但由于某种原因不更新变量 def find_donation_orgs(x): text = nltk.Text(nltk.word_tokenize(x)) donation = text.findall(r"<\.> <.*>{,15}? <

我创建了一个函数,用于搜索NLTK.text.text对象,并在运行该函数时返回一个值

更新:问题似乎是在下面的函数中,“捐赠”变量实际上没有被传递一个值。但是,text.findall函数确实返回一个值,但由于某种原因不更新变量

def find_donation_orgs(x):
    text = nltk.Text(nltk.word_tokenize(x))
    donation =  text.findall(r"<\.> <.*>{,15}? <donat.*|contrib.*|Donat.*|Contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ")
    return donation
输出=

Mr. T 's Tea Party
the Boys and Girls club
但是,当我尝试应用该函数以便将输出写入pandas数据帧中的新列时,它没有返回任何值。见下文:

df['donation_orgs'] = df.apply(lambda row: find_donation_orgs(row['Obit']), axis = 1)
text = df.text.iloc[1]

textfindall = text.findall(r"<\.> <.*>{,15}? <donat.*|contrib.*|Donat.*|Contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ")

print('text is ' + str(type(text)))
print('textfindall is ' + str(type(textfindall)))
print(textfindall)
其中df['Obit']是一个文本字符串,类似于上面的my a变量

更新:因此text.findall的输出似乎不会更新分配给它的变量的值。。。因此,我需要弄清楚如何实际将该输出分配给变量,以便将其返回到数据帧。见下文:

df['donation_orgs'] = df.apply(lambda row: find_donation_orgs(row['Obit']), axis = 1)
text = df.text.iloc[1]

textfindall = text.findall(r"<\.> <.*>{,15}? <donat.*|contrib.*|Donat.*|Contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ")

print('text is ' + str(type(text)))
print('textfindall is ' + str(type(textfindall)))
print(textfindall)
text=df.text.iloc[1]
textfindall=text.findall(r“{,15}?*?(+?)”)
打印('文本为'+str(类型(文本)))
print('textfindall是'+str(type(textfindall)))
打印(textfindall)
输出:

visit brother Alfred Fuller; the research of Dr. Giuseppe Giaccone at
Georgetown University
text is <class 'nltk.text.Text'>
textfindall is <class 'NoneType'>
none
拜访阿尔弗雷德·富勒兄弟;朱塞佩·贾科内博士的研究
乔治敦大学
文本是
textfindall是
没有一个

通过检查函数实际接收和返回的内容来调试代码。您可以使用调试器(在大多数IDE中都可以找到)或处理函数的返回值,以确保问题在于函数还是函数本身

def find_donation_orgs(x):
    return x
确保您的输入符合您的期望

def find_donation_orgs(x):
    return nltk.Text(nltk.word_tokenize(x))
看看标记化对它有什么影响

def find_donation_orgs(x):
    text = nltk.Text(nltk.word_tokenize(x))
    all_occurrences = text.findall(r"<\.> <.*>{,15}? <donat.*|contrib.*|Donat.*|Contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ")
    if all_occurrences is None:
        return "no occurrences"
    else:
        return all_occurrences
这是因为
文本
对象仅用于通过交互式控制台使用:

围绕简单(字符串)标记序列的包装器,用于支持文本的初始探索(通过交互式控制台)。[…]如果您希望编写一个利用这些分析的程序,那么您应该绕过
Text
类,直接使用适当的分析函数或类

您的函数应该如下所示:

from nltk.util import tokenwrap
def find_donation_orgs(x):
    searcher = nltk.TokenSearcher(nltk.word_tokenize(x))
    hits = searcher.findall(r"<\.> <.*>{,15}? <donat.*|contrib.*|Donat.*|Contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ")

    hits = [' '.join(h) for h in hits]
    donation = tokenwrap(hits, "; ")
    return donation
从nltk.util导入tokenwrap
def查找组织(x):
searcher=nltk.TokenSearcher(nltk.word\u tokenize(x))
hits=searcher.findall(r“{,15}?*?(+?)”)
hits=[''。在hits中为h加入(h)
捐赠=代币包装(点击“;”)
回赠

这将复制原始行为,但实际返回值除外。当然,一旦收到
点击列表,您可能希望以不同的格式设置输出。

通过检查函数实际接收和返回的内容来调试代码。您可以使用调试器(在大多数IDE中都可以找到)或处理函数的返回值,以确保问题在于函数还是函数本身

def find_donation_orgs(x):
    return x
确保您的输入符合您的期望

def find_donation_orgs(x):
    return nltk.Text(nltk.word_tokenize(x))
看看标记化对它有什么影响

def find_donation_orgs(x):
    text = nltk.Text(nltk.word_tokenize(x))
    all_occurrences = text.findall(r"<\.> <.*>{,15}? <donat.*|contrib.*|Donat.*|Contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ")
    if all_occurrences is None:
        return "no occurrences"
    else:
        return all_occurrences
这是因为
文本
对象仅用于通过交互式控制台使用:

围绕简单(字符串)标记序列的包装器,用于支持文本的初始探索(通过交互式控制台)。[…]如果您希望编写一个利用这些分析的程序,那么您应该绕过
Text
类,直接使用适当的分析函数或类

您的函数应该如下所示:

from nltk.util import tokenwrap
def find_donation_orgs(x):
    searcher = nltk.TokenSearcher(nltk.word_tokenize(x))
    hits = searcher.findall(r"<\.> <.*>{,15}? <donat.*|contrib.*|Donat.*|Contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ")

    hits = [' '.join(h) for h in hits]
    donation = tokenwrap(hits, "; ")
    return donation
从nltk.util导入tokenwrap
def查找组织(x):
searcher=nltk.TokenSearcher(nltk.word\u tokenize(x))
hits=searcher.findall(r“{,15}?*?(+?)”)
hits=[''。在hits中为h加入(h)
捐赠=代币包装(点击“;”)
回赠

这将复制原始行为,但实际返回值除外。当然,您可能希望在收到点击列表后以不同的格式设置输出。

df['generation\u orgs']=df['Obit'].apply(lambda x:find\u generation\u orgs(x),axis=1)
?该代码运行良好,确实创建了一个'generation\u orgs'列,但仍然在该列的每一行都不返回任何内容。。。我认为这是某种问题,我的函数总是返回一个非类型的对象,即使text.findall工作正常
df['generation\u orgs']=df['Obit'].apply(lambda x:find\u generation\u orgs(x),axis=1)
?代码运行正常,确实创建了一个'generation\u orgs'列,但仍然在该列的每一行中都不返回任何内容。。。我认为这是一个问题,我的函数总是返回一个非类型的对象,即使text.findall工作正常,所以前两个输出正好是我想要的。当我循环使用df['Obit']中的x时,第三个也是:find_generation_orgs(x)。。。我得到了一些不出现的结果,这是我期望的,但我也得到了包括“contrib”或“donat”在内的短语的正确值。然而,当我将它们写入数据帧时,每个实例都返回不出现的情况。我查看了nltk.Text().findall,而实际的问题似乎是该方法实际上没有返回任何内容,而是打印结果。我会根据前两个输出更新我的答案。当我循环使用df['Obit']中的x时,第三个也是:find_generation_orgs(x)。。。我得到了一些不出现的结果,这是我期望的,但我也得到了包括“contrib”或“donat”在内的短语的正确值。然而,当我将它们写入数据帧时,每个实例都返回不出现的情况。我查看了nltk.Text().findall,而实际的问题似乎是该方法实际上没有返回任何内容,而是打印结果。我会相应地更新我的答案