代码之家  ›  专栏  ›  技术社区  ›  Tavish Aggarwal

如何在pandas中转换json对象数组

  •  1
  • Tavish Aggarwal  · 技术社区  · 6 年前

    我正在从以下来源读取数据: https://www.kaggle.com/tmdb/tmdb-movie-metadata 使用如下所示的命令:

    tmdbDataSet = pd.read_csv('tmdb_5000_movies.csv')
    

    使用上述方法,一些列以json对象数组的形式包含数据,如生产国、关键字等。

    如何将这些列转换为多个列?

    我正在尝试这样做,如下所示:

    pd.io.json.json_normalize(tmdbDataSet.production_companies.apply(json.loads))
    

    但我犯了一个错误

    AttributeError:“列表”对象没有属性“值”

    编辑: 谢谢杨的帮助。但我观察到,生产公司的最大数组长度为26,这并不像您所说的创建这么多列的有效方法。我用下面的代码来计算长度。

    length =0
    for index, row in tmdbDataSet.iterrows():
        company = json.loads(row['production_companies'])
        if(len(company) > length):
            length = len(company)
    print(length)
    

    看来我需要寻找其他的选择。但我注意到口语栏有9个不同的值。我使用如下代码创建了9个不同的列:

    for i in range(9):
        tmdbDataSet['spoken_languages_' + str(i)] = ""
    

    然后当我运行以下代码时:

    columns = ['spoken_languages_0','spoken_languages_1','spoken_languages_2','spoken_languages_3','spoken_languages_4','spoken_languages_5','spoken_languages_6','spoken_languages_7','spoken_languages_8']
    tmdbDataSet[columns] = pd.DataFrame(tmdbDataSet.spoken_languages.values.tolist(), index= tmdbDataSet.index)
    print(tmdbDataSet.head())
    

    我得到一个错误:

    列的长度必须与键的长度相同 这是可以理解的,因为我没有固定长度的数组。请告诉我可能的解决方法?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Yang T    6 年前

    问题是你在打电话 json.loads 在列表对象上。当你打字的时候 tmdbDataSet.production_companies ,它从dataframe返回一个Series对象,您可以调用 apply() 方法论( documentation here ).

    然而,该系列中的每个元素仍然是一个 列表对象 -正如你敏锐地观察到的,当你注意到一些柱子 阵列 JSON对象的定义。因此,应用该函数 json。荷载 这部系列剧不会像 json。荷载 需要一个JSON对象,但收到的却是一个列表对象。

    这是由数据源进行的不幸的数据打包,但可能是因为数组的长度可能因行/电影而异。 也许访问这些数据的最佳/最简单的方法是编写一个循环(即: for company in row['production_companies']: )而不是尝试将该列解压缩为多个数据帧列 。如果要在不丢失任何数据的情况下解压缩该列,首先必须遍历该列并找到最长列表的长度,以便知道要创建多少新列。您还可能会遇到这样的情况:数据框中的大部分条目都是空格,因为最长的数组长度可能只出现一两次。

    编辑: 但是,如果您必须融化数据帧,以下是一个建议的过程(抱歉,我没有时间提供更多细节):

    1) 遍历production_Companys列,找到长度最长的数组 K .

    2) 创造 K 更多(空)列用于在dataframe中存储JSON对象。

    3) 再次遍历production_companies列,并查看数组: 对于数组中的每个JSON项: 拉出JSON文件并放入下一个可用的JSON列

    请注意,现在您的数据框中会有相当多的“nan”,因为许多电影的制作公司数量会低于最高水平。