Python 如何解决类型错误:字符串索引必须是整数,列表理解能力强于dict列表?

Python 如何解决类型错误:字符串索引必须是整数,列表理解能力强于dict列表?,python,pandas,list,dictionary,Python,Pandas,List,Dictionary,有人能给我解释一下为什么会这样: (独立) 以下是head命令的输出: df is a <class 'pandas.core.frame.DataFrame'> datatype id keywords_text keywords_list ==== ===== =================================================== ===========

有人能给我解释一下为什么会这样: (独立)

以下是head命令的输出:

df is a <class 'pandas.core.frame.DataFrame'> datatype
       id   keywords_text                                       keywords_list
==== =====  =================================================== ========================
row1    1   [{'id': 1495, 'name': 'fishing'}, {'id': 12392...   fishing best friend
row2    3   [{'id': 818, 'name': 'based on novel'}, {'id':...   based on novel interracial relationship
我得到这个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1473-18a756783d63> in <module>
     15 
     16 # df_movie_keywords['keywords_list'] = df_movie_keywords.apply(lambda row: string_all_keywords(row), axis=1)
---> 17 df_movie_keywords['keywords_list'] = df_movie_keywords['keywords'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
     18 
     19 # df['keywords_list'] = df['keywords_text'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   3846             else:
   3847                 values = self.astype(object).values
-> 3848                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3849 
   3850         if len(mapped) and isinstance(mapped[0], Series):
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()
<ipython-input-1473-18a756783d63> in <lambda>(column_value)
     15 
     16 # df_movie_keywords['keywords_list'] = df_movie_keywords.apply(lambda row: string_all_keywords(row), axis=1)
---> 17 df_movie_keywords['keywords_list'] = df_movie_keywords['keywords'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
     18 
     19 # df['keywords_list'] = df['keywords_text'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
<ipython-input-1473-18a756783d63> in <listcomp>(.0)
     15 
     16 # df_movie_keywords['keywords_list'] = df_movie_keywords.apply(lambda row: string_all_keywords(row), axis=1)
---> 17 df_movie_keywords['keywords_list'] = df_movie_keywords['keywords'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
     18 
     19 # df['keywords_list'] = df['keywords_text'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
TypeError: string indices must be integers
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
15
16#df#u movie_keywords['keywords_list']=df#u movie_keywords.apply(lambda行:string#u all_keywords(行),axis=1)
--->17 df_movie_关键字['keywords_list']=df_movie_关键字['keywords']。应用(lambda列_值:“”。加入([sub['name']表示列_值中的sub]))
18
19#df['keywords_list']=df['keywords_text']。应用(lambda列_值:“”。连接([sub['name']表示列_值中的sub]))
应用中的~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py(self、func、convert\u dtype、args、**kwds)
3846其他:
3847 values=self.astype(object.values)
->3848 mapped=lib.map\u推断(值,f,convert=convert\u数据类型)
3849
3850如果len(映射)和isinstance(映射[0],系列):
pandas/_libs/lib.pyx在pandas中。_libs.lib.map_infere()
in(列_值)
15
16#df#u movie_keywords['keywords_list']=df#u movie_keywords.apply(lambda行:string#u all_keywords(行),axis=1)
--->17 df_movie_关键字['keywords_list']=df_movie_关键字['keywords']。应用(lambda列_值:“”。加入([sub['name']表示列_值中的sub]))
18
19#df['keywords_list']=df['keywords_text']。应用(lambda列_值:“”。连接([sub['name']表示列_值中的sub]))
英寸(.0)
15
16#df#u movie_keywords['keywords_list']=df#u movie_keywords.apply(lambda行:string#u all_keywords(行),axis=1)
--->17 df_movie_关键字['keywords_list']=df_movie_关键字['keywords']。应用(lambda列_值:“”。加入([sub['name']表示列_值中的sub]))
18
19#df['keywords_list']=df['keywords_text']。应用(lambda列_值:“”。连接([sub['name']表示列_值中的sub]))
TypeError:字符串索引必须是整数
  • keywords
    列是一个字符串,而不是dict列表
  • 把它修好
  • 来自Kaggle的文件:
从ast导入文字\u评估
作为pd进口熊猫
df=pd.read\u csv('keywords.csv')
打印(类型(df.关键字[0]))
>>> 
df.keywords=df.keywords.apply(文字值)
打印(类型(df.关键字[0]))
>>> 
df['keywords_list']=df['keywords'].apply(lambda列_值):.join([sub['name']表示列_值中的sub]))
打印(测向头)
嫉妒玩具男孩友谊朋友竞争博。。。
1.基于儿童b。。。
两个钓鱼的好朋友,一个钓鱼的老人
3.基于新的种族关系,单身。。。
4婴儿中年危机信心老化女儿。。。
名称:关键字列表,数据类型:对象

欢迎来到SO!请将您的代码发布为ASCII,而不是unicode。聪明的引语和诸如此类的东西让人们很难轻松地运行它(从而帮助你找到答案)。谢谢。特伦顿-它与您的解决方案配合使用。感谢您迅速、出色的回答!我希望其他人也能从中获得价值。
df_movie_keywords[‘keywords_list’] = df_movie_keywords[‘keywords’].apply(lambda column_value : ” “.join([sub[‘name’] for sub in column_value]))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1473-18a756783d63> in <module>
     15 
     16 # df_movie_keywords['keywords_list'] = df_movie_keywords.apply(lambda row: string_all_keywords(row), axis=1)
---> 17 df_movie_keywords['keywords_list'] = df_movie_keywords['keywords'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
     18 
     19 # df['keywords_list'] = df['keywords_text'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   3846             else:
   3847                 values = self.astype(object).values
-> 3848                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3849 
   3850         if len(mapped) and isinstance(mapped[0], Series):
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()
<ipython-input-1473-18a756783d63> in <lambda>(column_value)
     15 
     16 # df_movie_keywords['keywords_list'] = df_movie_keywords.apply(lambda row: string_all_keywords(row), axis=1)
---> 17 df_movie_keywords['keywords_list'] = df_movie_keywords['keywords'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
     18 
     19 # df['keywords_list'] = df['keywords_text'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
<ipython-input-1473-18a756783d63> in <listcomp>(.0)
     15 
     16 # df_movie_keywords['keywords_list'] = df_movie_keywords.apply(lambda row: string_all_keywords(row), axis=1)
---> 17 df_movie_keywords['keywords_list'] = df_movie_keywords['keywords'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
     18 
     19 # df['keywords_list'] = df['keywords_text'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))
TypeError: string indices must be integers