如何将三列Pandas DataFrame转换为多线图所需JSON格式?
问题描述
现有如下三列Pandas DataFrame:
| id | date | count |
|---|---|---|
| A | 01-Nov | 20 |
| A | 02-Nov | 30 |
| A | 03-Nov | 50 |
| B | 01-Nov | 10 |
| B | 02-Nov | 45 |
| B | 03-Nov | 23 |
| C | 01-Nov | 12 |
| C | 02-Nov | 34 |
| C | 03-Nov | 45 |
生成该DataFrame的代码:
import pandas as pd df = pd.DataFrame({'id': ['A']*3+['B']*3+['C']*3 , 'date': ['01-Nov','02-Nov','03-Nov']*3 , 'count': [20,30,50,10,45,23,12,34,45]})
需要将其转换为适用于多线图的指定JSON格式:
{ "date": [ "01 Nov", "02 Nov", "03 Nov" ], "values": [ { "id": "A", "count": [20,30,50] }, { "id": "B", "count": [10,45,23] }, { "id": "C", "count": [12,34,45] } ] }
直接使用to_json方法无法得到上述目标格式,寻求可行的转换方法。
解决方法
用Pandas的分组、聚合操作配合Python字典构造就能实现目标格式,具体步骤和代码如下:
- 先处理日期格式,把原数据中
date列的-替换成空格,提取唯一的日期列表; - 按
id分组,把每个分组的count值整理成列表; - 把日期列表和分组结果组合成目标结构的字典,再转成JSON字符串。
完整代码实现
import pandas as pd import json # 生成原始DataFrame df = pd.DataFrame({'id': ['A']*3+['B']*3+['C']*3 , 'date': ['01-Nov','02-Nov','03-Nov']*3 , 'count': [20,30,50,10,45,23,12,34,45]}) # 处理日期并提取唯一值 date_list = df['date'].str.replace('-', ' ').unique().tolist() # 按id分组,将count转为列表 values_list = [] for id_val, group in df.groupby('id'): values_list.append({'id': id_val, 'count': group['count'].tolist()}) # 构造目标字典并转JSON result = { 'date': date_list, 'values': values_list } # 输出格式化后的JSON print(json.dumps(result, indent=4))
简洁写法
如果想更精简,也可以用groupby结合to_dict的方式实现:
import pandas as pd import json df = pd.DataFrame({'id': ['A']*3+['B']*3+['C']*3 , 'date': ['01-Nov','02-Nov','03-Nov']*3 , 'count': [20,30,50,10,45,23,12,34,45]}) date_list = df['date'].str.replace('-', ' ').unique().tolist() # 分组后直接转成字典列表 values_list = df.groupby('id')['count'].apply(list).reset_index().to_dict('records') result = {'date': date_list, 'values': values_list} print(json.dumps(result, indent=4))
注意:目标示例JSON中日期列表末尾的逗号不符合JSON标准,上述代码输出会自动去掉该多余逗号,保证JSON格式合法。
内容的提问来源于stack exchange,提问作者anuof90
相关产品推荐
相关产品推荐

