【问题标题】:How to resolve a TypeError: string indices must be integers, with list comprehension over list of dicts?如何解决 TypeError:字符串索引必须是整数,对字典列表进行列表理解?
【发布时间】:2020-08-24 16:37:29
【问题描述】:

有人可以向我解释一下为什么会这样: (独立)

numpy_data = np.array([[1, [{'id': 1495, 'name': 'fishing'}, {'id': 12392, 'name': 'best friend'}]], 
                   [3, [{‘id’: 818, ‘name’: ‘based on novel’}, {‘id’: 10131, ‘name’: ‘interracial relationship’}]]])
    df = pd.DataFrame(data=numpy_data, index=[“row1”, “row2"], columns=[“id”, “keywords_text”])
    df[‘keywords_list’] = df[‘keywords_text’].apply(lambda column_value : ” “.join([sub[‘name’] for sub in column_value]))
    df.head(20)

这是 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

这不会: (这是来自 Kaggle 电影数据集,关键字文件)

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

【问题讨论】:

  • 欢迎来到 SO!请将您的代码发布为 ASCII,而不是 unicode。智能引号等使人们难以轻松运行它(因此帮助您获得答案)。谢谢。

标签: python pandas list dictionary


【解决方案1】:
from ast import literal_eval
import pandas as pd

df = pd.read_csv('keywords.csv')

print(type(df.keywords[0]))

>>> <class 'str'>

df.keywords = df.keywords.apply(literal_eval)

print(type(df.keywords[0]))

>>> <class 'list'>

df['keywords_list'] = df['keywords'].apply(lambda column_value : " ".join([sub['name'] for sub in column_value]))

print(df.head)

0    jealousy toy boy friendship friends rivalry bo...
1    board game disappearance based on children's b...
2     fishing best friend duringcreditsstinger old men
3    based on novel interracial relationship single...
4    baby midlife crisis confidence aging daughter ...
Name: keywords_list, dtype: object

【讨论】:

  • 特伦顿 - 它适用于您的解决方案。感谢您的快速和出色的回答!我希望其他人也能从中获得价值。
猜你喜欢
  • 2017-11-20
  • 2020-11-10
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多