解析列中的字典时,字符串索引必须为整数

时间:2018-09-24 17:08:52

标签: python dictionary typeerror

在尝试分割电影数据集(csv文件),并用填充有字典类型的Genres列拆分时,遇到了此错误的一些问题,例如[{“ id”:28,“ name”:“ Action”} ,{“ id”:12,“ name”:“冒险”},...]。我正在尝试获取所有的“名称”值。我也对此进行了搜索,但不知道如何正确解决它。有没有人对此有解决方案。

import pandas
import numpy
import json
import matplotlib.pyplot

data = pandas.read_csv('Downloads/tmdb_5000_movies.csv')

def pipe_flatten_names(k):                 
    return '|'.join([x["name"] for x in k])
data['genres'] = data['genres'].apply(pipe_flatten_names)

下面是错误的样子

TypeError                                 Traceback (most recent call last)
<ipython-input-22-d02b9c57fd2e> in <module>()
      2 #    return '|'.join([i.get["name"] for i in x])
      3 
----> 4 data['genres'] = data['genres'].apply(pipe_flatten_names)
      5 
      6 liste_genres = set()                               #Combine all the 
genres collected into a list

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   3190             else:
   3191                 values = self.astype(object).values
-> 3192                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3193 
   3194         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer()

<ipython-input-21-6b978a26968e> in pipe_flatten_names(k)
      1 def abc(k):
      2     ds = (x["name"] for x in k)#Function collect genres name from Genres column
----> 3     return '|'.join(ds)

<ipython-input-21-6b978a26968e> in <genexpr>(.0)
  1 def pipe_flatten_names(k):
----> 2     ds = (x["name"] for x in k)#Function collect genres name from Genres column
  3     return '|'.join(ds)

TypeError: string indices must be integers

1 个答案:

答案 0 :(得分:0)

当您调用Apply方法时,将对用于调用函数Apply的CSV特定列中包含的每个数据调用一次作为参数传递的函数,其参数本身就是数据本身。例如:

如果我的CSV格式如下:

+-----+-----------+
|  id |      name |
+-----+-----------+
|   1 |    Action |
+-----+-----------+
|   2 | Adventure |
+-----+-----------+

在每次调用函数时,日期将作为字符串传递,因此如果我调用

x["name"].Apply(func)
使用函数Action和Adventure作为字符串将调用

func 2次,并且您要通过返回字符串作为索引来迭代该字符串(k),从而导致错误。 如果我正确理解,则您的CSV代表字典的字符串表示形式,因此您将不得不使用ast内置库将其转换,然后读取字典的每个元素。试试这个:

import pandas
import numpy
import ast
data = pandas.read_csv('Downloads/tmdb_5000_movies.csv', sep=';')

def pipe_flatten_names(k):                 
    genres = ast.literal_eval(k)
    return '|'.join(x['name'] for x in genres)
data['genres'] = data['genres'].apply(pipe_flatten_names)

我还更改了CSV文件中的分隔符,因为如果您的CSV用','分隔,并且字典使用',则它们会变得混乱,因此请尝试使用dict语法中未包含的分隔符< / p>