繁体   English   中英

如何使用应用程序从 python function 将多行返回到 pandas Z6A8064B5DF479455500553C7?

[英]How can I return multiple rows from a python function to a pandas dataframe using apply?

I am using a defined function to query a REST API which returns multiple rows per request from a pandas dataframe using apply. 看起来我到目前为止正在正确运行 function 但是因为 for 循环返回不止一行,所以我只得到最后一行。

我想要做的是为传递给 function 的每一行返回多行。

这是我正在使用的 function:

def get_entity_rec(row):
try:
    documents = row.content
    textcon = row.content[0:2000]
    doclang = [textcon]
    outputs = []
    result = client.recognize_entities(documents = doclang)[0]
    entitylength = len(result)
    for entity in result.entities:
            row['text'] = entity.text
            row['category'] = entity.category
            row['subcategory'] = entity.subcategory
    return row
except Exception as err:
    print("Encountered exception. {}".format(err))

以及我应用它的代码:

apandas3 = apandas2.apply(get_entity_rec, axis=1)

我得到(我认为是)最后的结果是这样的:

小路 文本 类别 子类别
文件路径 我是文字 我是返回的类别 我是返回的子类别

我想返回一个 dataframe ,其中原始列与 function 返回的每个“实体”重复,例如:

小路 文本 类别 子类别
文件路径 我是文字 我是返回的类别 我是返回的子类别
文件路径 我是文字 我是第一个返回的类别 我是第一个返回的子类别
文件路径 我是文字 我是第二类返回 我是返回的第二个子类别

apply的行只能使用返回一行的 function 时应用

为了实现您想要的,您可以将您的类别/子类别粘贴到一个存储在一行中的list中,然后explode 让我演示一下。 由于您的代码不是独立运行的(请在下一篇文章之前查看内容),这里有一个示例,希望能解释这个想法

# create an example df
df = pd.DataFrame({'path':['A','B','C'], 'text' : ['cat1A subcat1A cat2A subcat2A','cat1B subcat1B cat2B subcat2B', 'cat1C subcat1C cat2C subcat2C']})

# define our processing function
def get_entity_rec(row):
    text = row['text']
    tokens = text.split() # simulated processing
    categories = [tokens[0], tokens[2]] # note how we stick them in a list
    subcategories = [tokens[1], tokens[3]] # note how we stick them in a list
    row['cat'] = categories
    row['subcat'] = subcategories
    return row

这里我们创建一个简单的 df 和一个处理 function ,每个返回行需要返回多行。 但由于apply function 不允许这样做,它返回一行,其中多个值存储为列表

当我们将此 function 应用于 df

df.apply(get_entity_rec, axis=1)

我们得到这个

    path    text                            cat             subcat
0   A       cat1A subcat1A cat2A subcat2A   [cat1A, cat2A]  [subcat1A, subcat2A]
1   B       cat1B subcat1B cat2B subcat2B   [cat1B, cat2B]  [subcat1B, subcat2B]
2   C       cat1C subcat1C cat2C subcat2C   [cat1C, cat2C]  [subcat1C, subcat2C]

请注意类别和子类别如何在 df 内的列表中

现在我们可以分解我们的列——因为我们想并行subcat catexplode ,我们是这样做的:

df.apply(get_entity_rec, axis=1).apply(pd.Series.explode)

获得

 path   text                            cat     subcat
0   A   cat1A subcat1A cat2A subcat2A   cat1A   subcat1A
0   A   cat1A subcat1A cat2A subcat2A   cat2A   subcat2A
1   B   cat1B subcat1B cat2B subcat2B   cat1B   subcat1B
1   B   cat1B subcat1B cat2B subcat2B   cat2B   subcat2B
2   C   cat1C subcat1C cat2C subcat2C   cat1C   subcat1C
2   C   cat1C subcat1C cat2C subcat2C   cat2C   subcat2C

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM