在尝试分割电影数据集(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
答案 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>