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

2024-07-04 13:04:52 发布

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

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

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

使用上述方法,有些列的数据以json对象数组的形式存在,如生产国家、关键字等

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

我正在尝试如下所示:

^{pr2}$

但我错了

AttributeError: 'list' object has no attribute 'values'

编辑: 谢谢杨的帮助。但我注意到,生产公司的数组最大长度为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())

我得到一个错误:

Columns must be same length as key Which is understandable as I don't have fixed length of array. Please let me know possible solution to it?


Tags: csv代码jsonforindex数组tmdblength
1条回答
网友
1楼 · 发布于 2024-07-04 13:04:52

问题是您在一个列表对象上调用json.loads。当您输入tmdbDataSet.production_companies时,它从dataframe返回一个Series对象,您可以在(documentation here)上调用apply()方法。在

但是,这个系列中的每个元素仍然是一个列表对象——当您注意到有些列中包含JSON对象的数组时,您就敏锐地观察到了这一点。因此,将函数json.loads应用于该系列将不会起作用,因为json.loads需要一个JSON对象,而是接收一个list对象。在

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

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

1)遍历production_companies列,找到最长长度的数组k。在

2)创建k更多(空)列,用于在dataframe中存储JSON对象。在

3)再次迭代production_companies列,并对array执行以下操作: 对于数组中的每个JSON项: 拉出JSON文件并放入下一个可用的JSON列中

请注意,现在您的数据帧中会有很多“nan”,因为许多电影的制作公司数量将少于最高数量。在

相关问题 更多 >

    热门问题