我写了两个小程序:

  • 第一个从.txt文件导入数据到pandas数据框中,处理数据并将最终数据导出到json文件。
  • 第二个代码将来自json文件的数据导入回数据框。

  • 不幸的是,当从json文件导入数据时,列的顺序会发生变化。我在网上看到了几个示例,其中OrderedDict用于在新表中创建固定结构,但是如何将OrderedDict应用于现有表?

    我尝试了包括以下版本在内的多个版本,但没有一个起作用:
    df = OrderedDict(pd.DataFrame.from_dict(json_data, orient='columns'))
    


    data = OrderedDict(pd.read_csv('wtx2015.txt', sep=",", header=None))
    

    代码:.txt> Pandas 数据框> json
    import pandas as pd
    import json
    from pandas import DataFrame
    from collections import OrderedDict
    
    pd.set_option("max_columns", 50)
    
    """Defining functions"""
    
    data = pd.read_csv('wtx2015.txt', sep=",", header=None)
    data.columns = ["category1", "category2", "category3", "category4"]
    
    """Manipulating data"""
    
    print(data.head(n=3))
    
    df = DataFrame(data, columns= ["category1", "category2", "category3", "category4", "category5"])
    
    final = df.to_json(orient='records')
    with open('pandas_test.json', 'w') as f_obj:
        f_obj.write(final)
    

    代码:json> Pandas 数据框
    import pandas as pd
    import json
    
    file = 'pandas_test.json'
    with open(file) as f_obj:
        json_data = json.load(f_obj)
    
    df = pd.DataFrame.from_dict(json_data, orient='columns')
    
    print(df)
    

    最佳答案

    您可以在orient='split'中使用参数to_json/read_json,该参数也以原始顺序保存在列表中的json列名称中:

    df = pd.DataFrame({
            'C':list('abcdef'),
             'B':[4,5,4,5,5,4],
             'A':[7,8,9,4,2,3],
    })
    
    print (df.to_json(orient='split'))
    
    {"columns":["C","B","A"],
     "index":[0,1,2,3,4,5],
     "data":[["a",4,7],["b",5,8],
             ["c",4,9],["d",5,4],["e",5,2],["f",4,3]]}
    
    df.to_json('file.json', orient='split')
    df = pd.read_json('file.json', orient='split')
    print (df)
       C  B  A
    0  a  4  7
    1  b  5  8
    2  c  4  9
    3  d  5  4
    4  e  5  2
    5  f  4  3
    

    另一种选择:
    df.to_pickle('file')
    df = pd.read_pickle('file')
    

    下一个替代方法是添加到列表中的json列名称:
    import json
    
    j = {'columns': df.columns.tolist(), 'data' : df.to_dict(orient='records')}
    print (j)
    {'columns': ['C', 'B', 'A'],
     'data': [{'C': 'a', 'B': 4, 'A': 7},
              {'C': 'b', 'B': 5, 'A': 8},
              {'C': 'c', 'B': 4, 'A': 9},
              {'C': 'd', 'B': 5, 'A': 4},
              {'C': 'e', 'B': 5, 'A': 2},
              {'C': 'f', 'B': 4, 'A': 3}]}
    
    file = 'file.json'
    with open(file, 'w') as f_obj:
        json.dump(j, f_obj)
    
    with open(file) as f_obj:
        json_data = json.load(f_obj)
    
    df = pd.DataFrame(json_data['data'], columns=json_data['columns'])
    print(df)
       C  B  A
    0  a  4  7
    1  b  5  8
    2  c  4  9
    3  d  5  4
    4  e  5  2
    5  f  4  3
    

    10-07 13:04
    查看更多