Python 如何在pandas中转换json对象数组
我正在使用如下所示的命令从源读取数据:Python 如何在pandas中转换json对象数组,python,pandas,Python,Pandas,我正在使用如下所示的命令从源读取数据: tmdbDataSet = pd.read_csv('tmdb_5000_movies.csv') pd.io.json.json_normalize(tmdbDataSet.production_companies.apply(json.loads)) for i in range(9): tmdbDataSet['spoken_languages_' + str(i)] = "" 使用上述方法,一些列以json对象数组的形式包含数据,如生
tmdbDataSet = pd.read_csv('tmdb_5000_movies.csv')
pd.io.json.json_normalize(tmdbDataSet.production_companies.apply(json.loads))
for i in range(9):
tmdbDataSet['spoken_languages_' + str(i)] = ""
使用上述方法,一些列以json对象数组的形式包含数据,如生产国、关键字等
如何将这些列转换为多列
我正在尝试这样做,如下所示:
tmdbDataSet = pd.read_csv('tmdb_5000_movies.csv')
pd.io.json.json_normalize(tmdbDataSet.production_companies.apply(json.loads))
for i in range(9):
tmdbDataSet['spoken_languages_' + str(i)] = ""
但我犯了一个错误
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个不同的列:
tmdbDataSet = pd.read_csv('tmdb_5000_movies.csv')
pd.io.json.json_normalize(tmdbDataSet.production_companies.apply(json.loads))
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())
我得到一个错误:
列的长度必须与键的长度相同
这是可以理解的,因为我没有固定长度的数组。请让我知道可能的解决办法
问题在于,您正在对列表对象调用
json.loads
。当您键入tmdbDataSet.production\u companys
时,它会从数据帧返回一个Series对象,您可以在()上调用apply()
方法
但是,该系列中的每个元素仍然是一个列表对象——当您注意到一些列具有JSON对象数组时,您敏锐地观察到了这一点。因此,将函数json.loads
应用于该系列不会起作用,因为json.loads
需要一个json对象,而是接收一个列表对象
这是由数据源进行的不幸的数据打包,但可能是因为数组的长度可能因行/电影而异访问此数据的最佳/最简单方法可能是为第['production_Companys']行中的公司编写循环(即::
),而不是尝试将该列解压缩到多个数据帧列中。如果要在不丢失任何数据的情况下解压缩该列,首先必须遍历该列并找到最长列表的长度,以便知道要创建多少新列。您还可能会遇到这样的情况:数据帧中的大部分条目都是空白的占位符,因为最长的数组长度可能只出现一次或两次
编辑:
但是,如果您必须融化数据帧,以下是一个建议的过程(很抱歉,我没有时间提供更多详细信息):
1) 遍历production_companys列并找到最长长度k的数组
2) 创建k个以上(空)列,用于在数据框中存储JSON对象
3) 再次遍历production_Companys列,并针对数组:
对于数组中的每个JSON项:
拉出JSON文件并放入下一个可用的JSON列
请注意,您的数据框中现在将有很多“nan”,因为许多电影的制作公司数量将低于最高数量。如何在tmdbDataSet[“制作公司”]中为公司使用for循环
:
我可以将制作公司与电影相关联?我需要在单独的列中列出与电影相关联的公司列表。将公司列表与电影相关联后,您打算如何处理这些数据?^这将使我更好地了解如何回答您的后续问题。基本上,到目前为止,数据不干净,难以处理。所以我计划让生产公司在单独的列中,然后我可以融化我的数据集,得到干净的数据。希望这能让你了解我的最终目标。啊,我明白了。使用此数据集创建要融化的数据帧的任务将是非常具有挑战性和低效的,因为每部电影都有不同数量的制作公司(即:《蜘蛛侠3》有4家,而约翰·卡特只有1家)。我建议绕过“熔化”步骤,在需要时使用上面的for循环访问每个生产公司。但是,如果您坚持要融化数据帧,请参阅我对答案的编辑。