Python 将函数应用于行,将字典解压为多列

Python 将函数应用于行,将字典解压为多列,python,pandas,Python,Pandas,我正在使用NLTK的感伤强度分析器()处理存储在pandas列中的小体。Using.polarity_scores()返回包含四个键及其值的字典:neg、neu、pos和component 我想迭代数据帧中的每一行,计算joined_corpus['body]中包含的语料库上的极性分数,并在数据帧中将结果字典解压成四列。我无法找到将多个键:值对解压到pandas中的一列中的方法,因此我必须使用以下for循环: for index, row in joined_corpus.iterrows():

我正在使用NLTK的感伤强度分析器()处理存储在pandas列中的小体。Using.polarity_scores()返回包含四个键及其值的字典:neg、neu、pos和component

我想迭代数据帧中的每一行,计算joined_corpus['body]中包含的语料库上的极性分数,并在数据帧中将结果字典解压成四列。我无法找到将多个键:值对解压到pandas中的一列中的方法,因此我必须使用以下for循环:

for index, row in joined_corpus.iterrows():
    sentiment = sid.polarity_scores(row['body'])
    joined_corpus.loc[index, 'neg'] = sentiment['neg']
    joined_corpus.loc[index, 'neu'] = sentiment['neu']
    joined_corpus.loc[index, 'pos'] = sentiment['pos']
    joined_corpus.loc[index, 'compound'] = sentiment['pos']
    print("sentiment calculated for "+ row['subreddit'] + "of" + str(sentiment))
这将产生如下输出:

sentiment calculated for 1200isplentyof{'neg': 0.067, 'neu': 0.745, 'pos': 0.188, 'compound': 1.0}
sentiment calculated for 2007scapeof{'neg': 0.092, 'neu': 0.77, 'pos': 0.138, 'compound': 0.9998}
sentiment calculated for 2b2tof{'neg': 0.123, 'neu': 0.768, 'pos': 0.109, 'compound': -0.9981}
sentiment calculated for 2healthbarsof{'neg': 0.096, 'neu': 0.762, 'pos': 0.142, 'compound': 0.9994}
sentiment calculated for 2meirl4meirlof{'neg': 0.12, 'neu': 0.709, 'pos': 0.171, 'compound': 0.9997}
sentiment calculated for 3DSof{'neg': 0.054, 'neu': 0.745, 'pos': 0.201, 'compound': 1.0}
sentiment calculated for 3Dprintingof{'neg': 0.056, 'neu': 0.812, 'pos': 0.131, 'compound': 1.0}
sentiment calculated for 3dshacksof{'neg': 0.055, 'neu': 0.804, 'pos': 0.141, 'compound': 1.0}
sentiment calculated for 40kLoreof{'neg': 0.123, 'neu': 0.747, 'pos': 0.13, 'compound': 0.9545}
sentiment calculated for 49ersof{'neg': 0.098, 'neu': 0.715, 'pos': 0.187, 'compound': 1.0}
然而,这显然很慢,因为它不使用内置的apply命令。在这种情况下,有没有办法避免for循环?

使用apply

sentiment = df['body'].apply(lambda x : sid.polarity_scores(x))
df=pd.concat([df,sentiment.apply(pd.Series)],1)
那么


您可以使用列表理解:

res = [sid.polarity_scores(x) for x in df['body']]

for item in res:
    print(res)
您也可以直接从此列表创建系列:

df['sentiment'] = [sid.polarity_scores(x) for x in df['body']]

考虑到我有一个巨大的数据集,在这个apply语句发生时,有没有检查它的进度?尝试使用TQM库中的progress\u apply不起作用,因为apply位于一个系列而不是一个dataframe@Parseltongue如果你提到check(意思是每一个循环),我认为for循环是一个不错的选择,正如你在原稿中列出的那样post@Parseltongue我认为是这样,如果没有,您可以查看
numpy.vectorize
这看起来并不能完全满足我的需要。这会将这样一个字典:{'neg':0.0,'neu':0.83,'pos':0.17,'component':0.5719}放在表中的一列中。我想解压所有这些键,并将它们作为单独的列添加到df@Parseltongue将pd.DataFrame(情绪)更改为
情绪。应用(pd.Series)
df['sentiment'] = [sid.polarity_scores(x) for x in df['body']]