【问题标题】:Appending dataframes from json files in a for loop在 for 循环中附加来自 json 文件的数据帧
【发布时间】:2019-07-19 18:53:44
【问题描述】:

我正在尝试遍历文件夹中的 json 文件并将它们全部附加到一个 pandas 数据框中。

如果我说

import pandas as pd
import numpy as np
import json
from pandas.io.json import json_normalize
import os


directory_in_str = 'building_data'
directory = os.fsencode(directory_in_str)

df_all = pd.DataFrame()
with open("building_data/rooms.json") as file:
  data = json.load(file)
df = json_normalize(data['rooms'])
df_y.append(df, ignore_index=True)

我从一个文件中得到一个包含数据的数据框。如果我把这个想法变成一个 for 循环,我已经尝试过

import pandas as pd
import numpy as np
import json
from pandas.io.json import json_normalize
import os

directory_in_str = 'building_data'
directory = os.fsencode(directory_in_str)

df_all = pd.DataFrame()
for file in os.listdir(directory):
    with open(directory_in_str+'/'+filename) as file:
        data = json.load(file)
    df = json_normalize(data['rooms'])
    df_all.append(df, ignore_index=True)

print(df_all)

这将返回一个空数据框。有谁知道为什么会这样?如果我在附加之前打印df,它会打印正确的值,所以我不确定它为什么不附加。

谢谢!

【问题讨论】:

  • 面临同样的问题。这是因为 append 不能就地工作。 df_all = df_all.append(df, ignore_index=True) 将工作。但是,值得注意的是,对于大数据帧来说,这并不是一个省时的解决方案:stackoverflow.com/questions/36489576/…

标签: python pandas dataframe jupyter-notebook


【解决方案1】:

我会尝试像这样加入它们,而不是附加下一个 DataFrame:

if df_all.empty:
    df_all = df
else:
    df_all = df_all.join(df)

当加入 DataFrame 时,您可以指定它们应该加入的内容 - 在索引或特定(键)列上,以及如何加入(默认选项类似于附加 - 'left')。

这里是关于 pandas.DataFrame.join 的文档。

【讨论】:

    【解决方案2】:

    在这些情况下,我通过将每个文件返回的 dict 附加到该列表中来将 json 中的所有内容加载到列表中。然后我将列表传递给pandas.DataFrame.from_records (docs)

    在这种情况下,源会变成...

    import pandas as pd
    import numpy as np
    import json
    from pandas.io.json import json_normalize
    import os
    
    directory_in_str = 'building_data'
    directory = os.fsencode(directory_in_str)
    
    json_data = []
    for file in os.listdir(directory):
        with open(directory_in_str+'/'+filename) as file:
            data = json.load(file)
        json_data.append( json_normalize(data['rooms']) )
    
    df_all = pandas.DataFrame.from_records( json_data )
    
    print(df_all)
    

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 2016-12-19
      • 2015-04-05
      • 2023-03-23
      • 2019-10-15
      • 1970-01-01
      • 2021-10-03
      • 2022-01-04
      相关资源
      最近更新 更多