分析列中的词典时,字符串索引必须是整数

2024-05-08 13:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试拆分电影数据集(csv文件)时遇到了一些问题,其中“流派”列中填充了字典类型,例如[{“id”:28,“name”:“Action”},{“id”:12,“name”:“Adventure”},…]。我想得到所有的“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

Tags: csvnameinimportpandasfordatareturn
1条回答
网友
1楼 · 发布于 2024-05-08 13:36:46

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

如果我的CSV看起来像:

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

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

x["name"].Apply(func)

func将被调用两次,参数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语法中不包含的分隔符

相关问题 更多 >