如何在追加模式下导出DataFrame to_json - Python Pandas?

时间:2015-05-14 01:32:25

标签: python json numpy pandas dataframe

我有一个现有的json文件,格式为dicts列表。

$cat output.json
[{'a':1, 'b':2}, {'a':2, 'b':3}]

我有一个DataFrame

df = pd.DataFrame({'a':pd.Series([1,2], index=list('CD')), \
              "b":pd.Series([3,4], index=list('CD')})

我想用to_json保存“df”以将其附加到文件output.json:

df.to_json('output.json', orient='records')  #  mode='a' not available for to_json

* to_csv附加mode ='a',但for_json没有。

预期生成的output.json文件将是:

    [{'a':1, 'b':2}, {'a':2, 'b':3}, {'a':1, 'b':3}, {'a':2, 'b':4}]

现有文件output.json可能很大(比如Tetabytes),是否可以在不加载文件的情况下附加新的数据帧结果?

4 个答案:

答案 0 :(得分:0)

不,您无法使用pandasjson模块重写整个文件而附加到json文件。您可以手动修改文件"#34;通过以a模式打开文件并寻找正确的位置并插入数据。我不会推荐这个。如果你的文件大于RAM,最好只使用json以外的文件格式。

answer也可能有所帮助。它不会创建有效的json文件(而是每行都是一个json字符串),但它的目标与你的非常相似。

答案 1 :(得分:0)

也许您需要考虑orient='records'

def to_json_append(df,file):
    '''
    Load the file with
    pd.read_json(file,orient='records',lines=True)
    '''
    df.to_json('tmp.json',orient='records',lines=True)
    #append
    f=open('tmp.json','r')
    k=f.read()
    f.close()
    f=open(file,'a')
    f.write('\n') #Prepare next data entry
    f.write(k)
    f.close()

df=pd.read_json('output.json')
#Save again as lines
df.to_json('output.json',orient='records',lines=True)
#new data
df = pd.DataFrame({'a':pd.Series([1,2], index=list('CD')), \
              "b":pd.Series([3,4], index=list('CD')})
#append:
to_json_append(df,'output.json')

加载全部数据

pd.read_json('output.json',orient='records',lines=True)

答案 2 :(得分:0)

我已经通过使用内置的pandas.DataFrame方法解决了它。您需要记住在大型数据帧的情况下的性能(有多种处理方法)。 代码:

if os.path.isfile(dir_to_json_file):
    # if exist open read it
    df_read = pd.read_json(dir_to_json_file, orient='index')
    # add data that you want to save
    df_read = pd.concat([df_read, df_to_append], ignore_index=True)
    # in case of adding to much unnecessery data (if you need)
    df_read.drop_duplicates(inplace=True)

    # save it to json file in AppData.bin
    df_read.to_json(dir_to_json_file, orient='index')
else:
    df_to_append.to_json(dir_to_json_file, orient='index')

答案 3 :(得分:0)

用例,用小内存将大量数据写入JSON文件:

假设我们有 1,000 个数据框,每个数据框就像 1000,000 行 json。每个数据帧需要 100MB,总文件大小为 1000 * 100MB = 100GB。

解决方案:

  1. 使用缓冲区来存储每个数据帧的内容
  2. 使用 pandas 将其转储为文本
  3. 使用追加模式将文本写入文件末尾
*