将熊猫数据框列表转换为 json

Posted

技术标签:

【中文标题】将熊猫数据框列表转换为 json【英文标题】:convert list of pandas dataframe to json 【发布时间】:2018-08-25 18:18:02 【问题描述】:

我有一个熊猫数据框列表df_list。在该列表中,有 4 个数据框在列名和行数方面看起来很相似。

一个示例数据框,位于列表的索引 0:

df_list[0]:

str_col          vals1               vals2
hi             [1,2,3,5]      [0.4,0.4,0.5, 0.1]
hagha          [1,3,3,5]      [0.1,0.4,0.5, 0.1]
me             [4,4,3,5]      [0.9,0.4,0.5, 0.1]
i know         [1,4,3,5]      [0.1,0.7,0.9, 0.0]

在所有数据框中,str_col 列保持不变。它没有改变。只有vals1vals2 更改。 vals1vals2 是列表。 str_col 是字符串。

我最终想要的是数据框列表中的 json:

hi
       - list index 0: 
               - vals1
               - vals2
       - list index 1: 
               - vals1
               - vals2
       - list index 2: 
               - vals1
               - vals2
       - list index 3: 
               - vals1
               - vals2
       - list index 4: 
               - vals1
               - vals2

hagha
       - list index 0: 
               - vals1
               - vals2
       - list index 1: 
               - vals1
               - vals2
       - list index 2: 
               - vals1
               - vals2
       - list index 3: 
               - vals1
               - vals2
       - list index 4: 
               - vals1
               - vals2

and so on

以下更好的版本:(请不要将 vals1 和 vals2 的值与上面的示例进行比较)。


    "final_json": 
        "hi": 
            "0": 
                "vals1": [
                    1,
                    2,
                    3,
                    5
                ],
                "vals2": [
                    0.4,
                    0.4,
                    0.5,
                    0.1
                ]
            ,
            "1": 
                "vals1": [
                    8,
                    5,
                    5,
                    3
                ],
                "vals2": [
                    1,
                    0,
                    0,
                    0
                ]
            ,
            "2": 
                "vals1": [
                    2,
                    3,
                    6,
                    7
                ],
                "vals2": [
                    1,
                    0,
                    0,
                    0
                ]
            ,
            "3": 
                "vals1": [
                    3,
                    3,
                    5,
                    3
                ],
                "vals2": [
                    1,
                    0,
                    0,
                    0
                ]
            
        ,
        "hagha": 
            "0": 
                "vals1": [
                    6,
                    8,
                    9,
                    0
                ],
                "vals2": [
                    0.76,
                    0.76,
                    0.36,
                    0.363
                ]
            ,
            "1": 
                "vals1": [
                    2,
                    3,
                    4,
                    6
                ],
                "vals2": [
                    0.63,
                    0.36,
                    0.46,
                    0.6
                ]
            ,
            "2": 
                "vals1": [
                    3,
                    6,
                    5,
                    5
                ],
                "vals2": [
                    0.4,
                    0.64,
                    0.46,
                    0.456                
                    ]
            ,
            "3": 
                "vals1": [
                    4,
                    6,
                    3,
                    2                
                ],
                "vals2": [
                    0.657,
                    0.675,
                    0.64,
                    0.6                
                ]
            



 .
 .
 .
 .
 .
                ]
            
        
    

目前我正在遍历列表中的所有数据帧,而且速度太慢。我想知道是否存在更快的解决方案来实现这一点(可以to_json)?

【问题讨论】:

你试过df.to_json(orient='index') 对于一个数据框?是的,它没有给我所需的结果。请看,有超过 1 个数据框。 您是否尝试过从数据框列表中创建一个数据框? new_df = pd.concat(df_list).reset_index() 是的。我也尝试将其转换为多索引,但 json 结果不是我循环时得到的结果。 【参考方案1】:
import pandas as pd
import json
import pprint

我想你可以先concat列出keys参数来区分每个DataFrame

df = pd.concat(dfs, keys=range(len(dfs)))
#print (df)

然后删除MultiIndexgroupby的第一级并创建dictionaries,最后通过to_dict将输出转换为dict

d = (df.reset_index(level=1, drop=True)
      .groupby('str_col')['vals1','vals2']
      .apply(lambda x: x.to_dict(orient='index'))
      .to_dict()      
      )
#add start of json
d = "final_json": d

pprint.pprint(d)
'final_json': 'hagha': 0: 'vals1': [1, 3, 3, 5],
                              'vals2': [0.1, 0.4, 0.5, 0.1],
                          1: 'vals1': [10, 30, 3, 5],
                              'vals2': [0.17, 0.47, 0.57, 0.17],
                'hi': 0: 'vals1': [1, 2, 3, 5],
                           'vals2': [0.4, 0.4, 0.5, 0.1],
                       1: 'vals1': [10, 20, 30, 50],
                           'vals2': [0.48, 0.48, 0.58, 0.18],
                'i know': 0: 'vals1': [1, 4, 3, 5],
                               'vals2': [0.1, 0.7, 0.9, 0.0],
                           1: 'vals1': [1, 4, 3, 5],
                               'vals2': [0.1, 0.7, 0.9, 0.0],
                'me': 0: 'vals1': [4, 4, 3, 5],
                           'vals2': [0.9, 0.4, 0.5, 0.1],
                       1: 'vals1': [4, 4, 3, 5],
                           'vals2': [0.9, 0.4, 0.5, 0.1]

#convert to json                 
json = json.dumps(d)

设置

df1 = pd.DataFrame('str_col': ['hi', 'hagha', 'me', 'i know'], 'vals1': [[1, 2, 3, 5], [1, 3, 3, 5], [4, 4, 3, 5], [1, 4, 3, 5]], 'vals2': [[0.4, 0.4, 0.5, 0.1], [0.1, 0.4, 0.5, 0.1], [0.9, 0.4, 0.5, 0.1], [0.1, 0.7, 0.9, 0.0]])
print (df1)
#  str_col         vals1                 vals2
#0      hi  [1, 2, 3, 5]  [0.4, 0.4, 0.5, 0.1]
#1   hagha  [1, 3, 3, 5]  [0.1, 0.4, 0.5, 0.1]
#2      me  [4, 4, 3, 5]  [0.9, 0.4, 0.5, 0.1]
#3  i know  [1, 4, 3, 5]  [0.1, 0.7, 0.9, 0.0]

df2 = pd.DataFrame('str_col': ['hi', 'hagha', 'me', 'i know'], 'vals1': [[10, 20, 30, 50], [10, 30, 3, 5], [4, 4, 3, 5], [1, 4, 3, 5]], 'vals2': [[0.48, 0.48, 0.58, 0.18], [0.17, 0.47, 0.57, 0.17], [0.9, 0.4, 0.5, 0.1], [0.1, 0.7, 0.9, 0.0]])
print (df2)
#  str_col             vals1                     vals2
#0      hi  [10, 20, 30, 50]  [0.48, 0.48, 0.58, 0.18]
#1   hagha    [10, 30, 3, 5]  [0.17, 0.47, 0.57, 0.17]
#2      me      [4, 4, 3, 5]      [0.9, 0.4, 0.5, 0.1]
#3  i know      [1, 4, 3, 5]      [0.1, 0.7, 0.9, 0.0]

#create list of DataFrames
dfs = [df1, df2]

【讨论】:

它看起来是正确的,除了 json 中的索引 0,1 必须是字符串而不是 int。 @AbhishekThakur - 我打印dictionary,如果测试json = json.dumps(d) 是正确的。

以上是关于将熊猫数据框列表转换为 json的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表列表转换为数据框?(熊猫)

将列表转换为熊猫数据框python [重复]

如何将熊猫数据框转换为嵌套的 json

将带有列表的字典转换为熊猫数据框

如何将几列熊猫数据框转换为另一条记录中的 JSON 记录?

将熊猫数据框转换为numpy数组[重复]