【发布时间】:2019-11-14 12:28:57
【问题描述】:
我正在尝试执行 EDA 演练,并通过使用循环处理包含 json 数据的列来转换/提取数据框中的 json 数据。我这样做是通过为循环设置一个列表进行迭代,然后设置 for 循环以加载 json 数据并为每列的每一行提取名称字段。
在处理列表中的第一列后,它会抛出一个“JSON 对象必须是 str、bytes 或 bytearray,而不是 'list'”错误。
我尝试通过添加和删除列来修改列表以查看失败的位置,它始终适用于第一列,但之后放弃。对于一列的列表,这仍然适用。
我认为问题在于正在传递的“json.loads(data)”以某种方式仍然指向最后一个循环的结果(因为最后一个循环中的 json 被转换/提取到一个列表中)。但我不确定是否是这种情况,如果是,如何解决。
代码如下:
json_fields = ['genres', 'production_countries', 'spoken_languages']
for field in json_fields:
print(field)
movies_df[field] = movies_df[field].apply(lambda data:[row['name'] for row in json.loads(data)])
这是回溯:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-15-cc13bd0423f3> in <module>()
3 for field in json_fields:
4 print(field)
----> 5 movies_df[field] = movies_df[field].apply(lambda data:[row['name'] for row in json.loads(data)])
~/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
2549 else:
2550 values = self.asobject
-> 2551 mapped = lib.map_infer(values, f, convert=convert_dtype)
2552
2553 if len(mapped) and isinstance(mapped[0], Series):
pandas/_libs/src/inference.pyx in pandas._libs.lib.map_infer()
<ipython-input-15-cc13bd0423f3> in <lambda>(data)
3 for field in json_fields:
4 print(field)
----> 5 movies_df[field] = movies_df[field].apply(lambda data:[row['name'] for row in json.loads(data)])
~/anaconda3/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
346 if not isinstance(s, (bytes, bytearray)):
347 raise TypeError('the JSON object must be str, bytes or bytearray, '
--> 348 'not {!r}'.format(s.__class__.__name__))
349 s = s.decode(detect_encoding(s), 'surrogatepass')
350
TypeError: the JSON object must be str, bytes or bytearray, not 'list'
这里是结果表的链接: https://imgur.com/a/yHDdFM8
Genres 是有效的列,另外两个是无效的列示例
编辑:这是我正在使用的表格的来源:https://www.kaggle.com/tmdb/tmdb-movie-metadata/
【问题讨论】:
-
您的 lambda 表达式为每一行返回 [row['name'] for row in json.loads(data)]。我猜您更希望将每个文档的名称分配给另一行,对吧?
-
@jottbe,我很难理解您所说的文档是什么意思。您的意思是“数据”是指每行中包含的数据,因为它通过 for 循环?
-
那么目标是将图像中每个突出显示的列转换为名称列表而不是字典吗?
-
@exlo,文档是指 json 文档(与行相同)。很抱歉混淆了这些条款。
-
@exlo 你能补充一下你在数据框中的阅读方式吗,当我使用
movies_df = pandas.Dataframe.from_csv(filename)然后运行相同的代码时,我没有遇到同样的问题。
标签: python json pandas loops jupyter-notebook