zip dict在创建JSON文件时将整数列表转换为字符串



我正在尝试从数据帧中保存JSON文件。

样本数据:

import pandas as pd
import json
df
Metric          Value
0   Line1           10% off
1   Line2           15% off
2   Line3           20% off
3   Line4           25% off
4   Line5           30% off
5   revenueXaxis    ['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5', 'Week 6', 'Week 7', 'Week 8']
6   Revenuedata1    [30, 30, 30, 30, 30, 30, 30, 30]
7   Revenuedata2    [25, 25, 25, 20, 25, 25, 25, 25]
8   Revenuedata3    [15, 15, 15, 15, 15, 15, 15, 15]
9   Revenuedata4    [15, 10, 10, 10, 10, 10, 10, 10]
10  Revenuedata5    [10, 10, 10, 10, 10, 10, 10, 10]

当我执行以下zip操作将其转换为字典时,Revenuedata1Revenuedata5中的列表值转换为字符串,如下所示:

dict(zip(df.iloc[:,0], df.iloc[:,1]))
{'Line1': '10% off',
'Line2': '15% off',
'Line3': '20% off',
'Line4': '25% off',
'Line5': '30% off',
'revenueXaxis': "['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5', 'Week 6', 'Week 7', 'Week 8']",
'Revenuedata1': '[30, 30, 30, 30, 30, 30, 30, 30]',
'Revenuedata2': '[25, 25, 25, 20, 25, 25, 25, 25]',
'Revenuedata3': '[15, 15, 15, 15, 15, 15, 15, 15]',
'Revenuedata4': '[15, 10, 10, 10, 10, 10, 10, 10]',
'Revenuedata5': '[10, 10, 10, 10, 10, 10, 10, 10]'}

当我使用json.dump将其写入文件时,我得到的输出如下:

"ExpectedRevenue": {
"Line1": "10% off",
"Line2": "15% off",
"Line3": "20% off",
"Line4": "25% off",
"Line5": "30% off",
"revenueXaxis": "['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5', 'Week 6', 'Week 7', 'Week 8']",
"Revenuedata1": "[50, 110, 180, 260, 350, 450, 550, 650]",
"Revenuedata2": "[20, 45, 75, 110, 150, 195, 245, 300]",
"Revenuedata3": "[5, 15, 28, 43, 60, 78, 98, 120]",
"Revenuedata4": "[4, 10, 17, 2, 35, 46, 58, 72]",
"Revenuedata5": "[3, 8, 13.5, 19.5, 26.5, 34.5, 44, 54]"
},

有人能让我知道如何保持整型列表值,而不是字符串。

预期输出:

"ExpectedRevenue": [{
"Line1": "10% off",
"Line2": "15% off",
"Line3": "20% off",
"Line4": "25% off",
"Line5": "30% off",
"revenueXaxis": ["Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6", "Week 7", "Week 8"],
"Revenuedata1": [50, 110, 180, 260, 350, 450, 550, 650],
"Revenuedata2": [20, 45, 75, 110, 150, 195, 245, 300],
"Revenuedata3": [5, 15, 28, 43, 60, 78, 98, 120],
"Revenuedata4": [4, 10, 17, 2, 35, 46, 58, 72],
"Revenuedata5": [3, 8, 13.5, 19.5, 26.5, 34.5, 44, 54]
}]

如果字符串以[开头,仅对已过滤的行按ast.literal_eval转换值为列表:

import ast
m = df['Value'].str.startswith('[')
df.loc[m, 'Value'] = df.loc[m, 'Value'].apply(ast.literal_eval)

最后一次创建字典:

print (df.set_index('Metric')['Value'].to_dict())
print (dict(zip(df.iloc[:,0], df.iloc[:,1])))

编辑:您可以检查未转换的值并将其替换为空列表,也可以使用print查看失败的值:

import ast
def literal_eval_cust(x):
try:
return ast.literal_eval(x)
except Exception:
print (x)
return []

df.loc[m, 'Value'] = df.loc[m, 'Value'].apply(literal_eval_cust)

最新更新