При разборе словаря в столбце строковые индексы должны быть целыми числами - PullRequest
0 голосов
/ 24 сентября 2018

У меня возникла проблема с этой ошибкой при попытке разделить набор данных фильма (файл CSV) со столбцом Жанры, заполненным типом словаря, например, например [{"id": 28, "name": "Action"}, {"id": 12, "name": "Adventure"}, ...].Я пытаюсь получить все "имя" значение.Я также искал об этом, но не знаю, как это исправить правильно.Есть ли у кого-нибудь решение для этого.

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 голосов
/ 24 сентября 2018

Когда вы вызываете метод Apply, ваша функция, переданная в качестве параметра, будет вызываться один раз для всех данных, содержащихся в определенном столбце вашего CSV, используемого для вызова функции Apply, причем ее параметр соответствует самим данным.Например:

Если мой CSV выглядит следующим образом:

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

При каждом вызове вашей функции дата будет передана в виде строки, поэтому, если я вызову

x["name"].Apply(func)

func будет вызываться 2 раза с параметрами Action и Adventure в виде строки, и вы будете строкой для итерации этой строки (k), передавая строку в качестве индекса, отсюда и ошибка.Если я правильно понял, у вас есть CSV, представляющий строковое представление словаря, поэтому вам придется преобразовать его, используя встроенную библиотеку ast, а затем прочитать каждый элемент dict.Попробуйте это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...