如何解决-ValueError:无法使用长度与Python中的值不同的多索引选择索引器进行设置

问题描述

我有一些示例代码,可用于使用Google的自然语言API分析实体及其情感。对于我的Pandas数据框中的每条记录,我想返回一个字典列表,其中每个元素都是一个实体。但是,在尝试将其用于生产数据时遇到了问题。这是示例代码

from google.cloud import language_v1 # version 2.0.0
import os 
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/json'
import pandas as pd 

# establish client connection
client = language_v1.LanguageServiceClient()

# helper function 
def custom_analyze_entity(text_content):
    global client
    #print("Accepted Input::" + text_content)
    document = language_v1.Document(content=text_content,type_=language_v1.Document.Type.PLAIN_TEXT,language = 'en')
    response = client.analyze_entity_sentiment(request = {'document': document})
    # a document can have many entities
    # create a list of dictionaries,every element in the list is a dictionary that represents an entity
    # the dictionary is nested
    l = []
    #print("Entity response:" + str(response.entities))
    for entity in response.entities:
        #print('=' * 20)
        temp_dict = {}
        temp_Meta_dict = {}
        temp_mentions = {}
        temp_dict['name'] = entity.name
        temp_dict['type'] = language_v1.Entity.Type(entity.type_).name
        temp_dict['salience'] = str(entity.salience)
        sentiment = entity.sentiment
        temp_dict['sentiment_score'] = str(sentiment.score)
        temp_dict['sentiment_magnitude'] = str(sentiment.magnitude)
        for Metadata_name,Metadata_value in entity.Metadata.items():
            temp_Meta_dict['Metadata_name'] = Metadata_name
            temp_Meta_dict['Metadata_value'] = Metadata_value
        temp_dict['Metadata'] = temp_Meta_dict
        for mention in entity.mentions:
            temp_mentions['mention_text'] = str(mention.text.content)
            temp_mentions['mention_type'] = str(language_v1.EntityMention.Type(mention.type_).name)
        temp_dict['mentions'] = temp_mentions
        #print(u"Appended Entity::: {}".format(temp_dict))
        l.append(temp_dict)
    return l

我已经在样本数据上对其进行了测试,并且效果很好

# works on sample data 
data= ['Grapes are good. Bananas are bad.','the weather is not good today','Michelangelo Caravaggio,Italian painter,is kNown for many arts','look i cannot articulate how i feel today but its amazing to be back on the field with runs under my belt.']
input_df = pd.DataFrame(data=data,columns = ['freeform_text'])

for i in range(len(input_df)):
    op = custom_analyze_entity(input_df.loc[i,'freeform_text'])
    input_df.loc[i,'entity_object'] = op

但是当我尝试使用下面的代码通过生产数据来解析它时,它会失败并出现多索引错误。我无法使用示例熊猫数据框重现该错误

for i in range(len(input_df)):
    op = custom_analyze_entity(input_df.loc[i,'entity_object'] = op
... 
Traceback (most recent call last):
  File "<stdin>",line 3,in <module>
  File "/opt/conda/default/lib/python3.6/site-packages/pandas/core/indexing.py",line 670,in __setitem__
    iloc._setitem_with_indexer(indexer,value)
  File "/opt/conda/default/lib/python3.6/site-packages/pandas/core/indexing.py",line 1667,in _setitem_with_indexer
    "cannot set using a multi-index "
ValueError: cannot set using a multi-index selection indexer with a different length than the value

解决方法

尝试这样做:

input_df.loc[0,'entity_object'] = ""
for i in range(len(input_df)):
    op = custom_analyze_entity(input_df.loc[i,'freeform_text'])
    input_df.loc[i,'entity_object'] = op

或者对于您的特定情况,您不需要使用 loc 功能。

input_df["entity_object"] = ""
    for i in range(len(input_df)):
        op = custom_analyze_entity(input_df.loc[i,'freeform_text'])     
        input_df["entity_object"][i] = op

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...