gpt4 book ai didi

python - 如何使用apply从python函数返回多行到pandas数据帧?

转载 作者:行者123 更新时间:2023-12-04 08:01:31 35 4
gpt4 key购买 nike

我正在使用定义的函数来查询 REST API,该 API 使用 apply 从 Pandas 数据帧中为每个请求返回多行。到目前为止,我所做的似乎是正确运行该函数,但是由于 for 循环返回不止一行,所以我只能得到最后一行。
我想要做的是为我传递给函数的每一行返回多行。
这是我正在使用的功能:

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)
我得到(我认为是)最后的结果是这样的:


小路
文本
类别
子类


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


我想返回一个数据框,其中的原始列与函数 lke 返回的每个“实体”重复:


小路
文本
类别
子类


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

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

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

最佳答案

apply当应用的行只能使用返回一行的函数时
为了实现您想要的,您可以将您的类别/子类别放入 list存储在一行中,然后 explode .让我示范一下。由于您的代码不是独立运行的(请在下一篇文章之前查看 this!),这里有一个示例,希望能解释这个想法

# 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 和一个处理函数,每个返回行需要返回多行。但由于 apply 不允许这样做函数,它返回一行,其中多个值存储为列表
当我们将此函数应用于 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 内的列表中的位置
现在我们可以 explode我们的柱子——因为我们想要爆炸 catsubcat同时,这是我们如何做到的:
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

关于python - 如何使用apply从python函数返回多行到pandas数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66444444/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com