[英]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
cat
和explode
,我们是这样做的:
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.