将熊猫数据框列表转换为 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
列保持不变。它没有改变。只有vals1
和vals2
更改。 vals1
和 vals2
是列表。 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
列出key
s参数来区分每个DataFrame
:
df = pd.concat(dfs, keys=range(len(dfs)))
#print (df)
然后删除MultiIndex
、groupby
的第一级并创建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的主要内容,如果未能解决你的问题,请参考以下文章