如何使用pandas apply替换iterrow?

我正在根据新闻标题计算数据集中每一行的情感值。我使用iterrows实现了这一点:

field = 'headline'
dfp = pd.DataFrame(columns=('pos', 'neg', 'neu'))

tokenizer = AutoTokenizer.from_pretrained("ProsusAI/finbert")

model = AutoModelForSequenceClassification.from_pretrained("ProsusAI/finbert")

for index, row in df.iterrows():
    text = row[field]
    encoded_input = tokenizer(text, return_tensors='pt')
    output = model(**encoded_input)
    probs = torch.nn.functional.softmax(output[0], dim=-1)
    probs_arr = probs.cpu().detach().numpy()
    dfp = dfp.append({'pos': probs_arr[0][0],
                      'neg': probs_arr[0][1],
                      'neu': probs_arr[0][2]
                     }, ignore_index=True)

但是,处理时间太长(>30分钟的运行时间,而且还没有完成)。我的数据集中有16.6k行。

这是数据集的一小部分:

    datetime            headline
0   2020-03-17 16:57:07 12 best noise-cancelling headphones: In-ear an...
1   2020-06-08 14:00:55 5G Stocks To Buy And Watch: Pricing of 5G Smar...
2   2020-06-19 10:00:00 10 best wireless printers that will make your ...
3   2020-08-19 00:00:00 Apple Confirms Solid New iOS 14 Security Move ...
4   2020-08-19 00:00:00 Apple Becomes First U.S. Company Worth More Th...

我读到过,在大多数情况下不推荐使用iterrows,除非数据集很小,并且优化不是问题。它的替代方案似乎是使用apply,因为apply遍历了每个熊猫行并进行了优化。

我读过的一些SO主题建议在apply中创建一个函数并运行它。这是我尝试过的:

def calPred(text):
    encoded_input = tokenizer(text, return_tensors='pt')
    output = model(**encoded_input)
    probs = torch.nn.functional.softmax(output[0], dim=-1)
    probs_arr = probs.cpu().detach().numpy()
    dfp = dfp.append({'pos': probs_arr[0][0],
                      'neg': probs_arr[0][1],
                      'neu': probs_arr[0][2]
                     }, ignore_index=True)

df['headline'].apply(lambda x: calPred(x))

它返回了一个错误UnboundLocalError: local variable 'dfp' referenced before assignment

如果有人能指导我如何优化和正确使用apply,我将不胜感激。提前谢谢。

转载请注明出处:http://www.kldfzc.com/article/20230526/1746354.html