我正在尝试从数据帧中保存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
操作将其转换为字典时,Revenuedata1
到Revenuedata5
中的列表值转换为字符串,如下所示:
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)