【问题标题】:make a dataframe from many json files从许多 json 文件中创建一个数据框
【发布时间】:2022-01-01 10:27:37
【问题描述】:

我尝试读取多个 json 文件,用每个文件创建一个数据帧,然后将所有这些数据帧连接到一个数据帧中,但是程序只用它读取的最后一个文件创建一个数据帧而没有错误。所有 json 文件具有相同的结构。你知道我的代码要改什么吗?

代码如下:

import json
import pandas as pd
import os

df1=None
path = 'C:\\Users\\sotir\\Desktop\\machinedataset'
filenames = os.listdir(path)

for filename in sorted(filenames):
    if filename.startswith("mpd.slice") and filename.endswith(".json"):
        fullpath = os.sep.join((path, filename))
        f = open(fullpath)
        js = json.load(f)
        f.close()
        df= pd.json_normalize(js['playlists'], meta=['name', 'collaborative', 'pid', 'modified_at','num_tracks', 'num_albums',
                                              'num_followers', 'num_edits', 'duration_ms', 'num_artists'],record_path= ['tracks'],
                       record_prefix='_')
        if df1==None:
            df1= df
        else:
            
            df1=pd.concat([df1,df])

我更新了代码,但出现了这个错误:

ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_20464/3545215146.py in <module>
     16                                               'num_followers', 'num_edits', 'duration_ms', 'num_artists'],record_path= ['tracks'],
     17                        record_prefix='_')
---> 18         if df1==None:
     19             df1= df
     20         else:

~\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1440     @final
   1441     def __nonzero__(self):
-> 1442         raise ValueError(
   1443             f"The truth value of a {type(self).__name__} is ambiguous. "
   1444             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

  • 你可能想做类似df1=None; ...; df=pd. ...; if df1=None: df1=df; else: df1=pd.concat([df1,df])
  • 我更新了代码但出现错误

标签: python json pandas


【解决方案1】:

df1==None 返回一个充满值的DataFrame - 可能包括TrueFalse。当您将这样的对象传递给if 时,它不知道如何处理它,所以它只会抛出一个错误。要修复此错误,请替换为:

if df1 is None:

无论如何,为什么不先将所有这些数据帧放入一个列表中,然后只调用一次pd.concat

【讨论】:

  • 非常感谢您的回复,我将上述行更改为 if df1 is None: 但我只从一个文件而不是所有文件中获取数据。你能告诉我如何将所有这些数据帧放入一个列表中,然后调用 pd.concat 吗? (对不起,我是编程新手)
  • 可能是因为只有第一个文件满足你的条件?在循环之前创建一个列表并将所有数据帧附加到它(dfs.append(df))然后运行pd.concat(dfs)
猜你喜欢
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多