将python中的dataframe转换为以下形式的json

2024-04-25 15:00:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个Python代码实现来将Pandas Dataframe转换成下面提到的格式的json文件。你知道吗

输入Python数据帧如下(input_data - dataframe name

  stateacttraf |stateno  | statename | actno | actname | traffic | reward   | id     |   message  

  stateacttraf |     1   |   S1      | 1     | A1      |  22     |   3      | 234569 |   stateactsplit   
  stateacttraf |     1   |   S1      | 2     | A2      |  30     |   4      | 234569 |   stateactsplit  
  stateacttraf |     1   |   S1      | 3     | A3      |  48     |   2.3    | 234569 |   stateactsplit  
  stateacttraf |     2   |   S2      | 1     | A1      |  13     |   4.1    | 234569 |   stateactsplit  
  stateacttraf |     2   |   S2      | 2     | A2      |  27     |   8.2    | 234569 |   stateactsplit  
  stateacttraf |     2   |   S2      | 3     | A3      |  60     |   5.6    | 234569 |   stateactsplit  

Dataframe应该像以下json格式的示例,需要在kafka中发布:

预期json输出示例:

{  
"stateacttraf": "1, S1, 1 , A1 , 24.5,3 \n  
 1, S1, 2 , A2 , 25.5,4 \n  
 1, S1, 3 , A3 , 20,2.3 \n  
 2, S2, 1 , A1 , 10,4.1 \n  
 2, S2, 2 , A2 , 10,8.2 \n   
 2, S2, 2 , A2 , 10,5.6 \n",   
 "message": "stateactsplit",  
 "id": 234569  
}  

在示例输出中,\n只是表示这些(1, S1, 2 , A2 , 25.5,4)的每一行都应该打印在新行中。你知道吗

尝试使用input_data.to_json(orient='index', lines=True),但每行中的每个值的列名都会重复。你知道吗


Tags: idjsona2示例messagedataframeinputdata
1条回答
网友
1楼 · 发布于 2024-04-25 15:00:15

这不是一个好的JSON格式,但是我编写了适合您的代码:

raw_data = {'stateacttraf': ['stateacttraf','stateacttraf','stateacttraf','stateacttraf', 'stateacttraf2','stateacttraf2' ],
        'stateno':     [1, 1, 1, 2, 3, 4],
        'statename':    ['S1', 'S1', 'S1', 'S2','S3', 'S4'], 
        'id':    [234569, 234569, 234569, 234569, 99, 99],
        'message':    ['stateactsplit','stateactsplit', 'stateactsplit','stateactsplit','stateacttraf2', 'stateacttraf2']}

df = pd.DataFrame(raw_data).set_index(['stateacttraf'])

               stateno statename      id        message
stateacttraf                                           
stateacttraf         1        S1  234569  stateactsplit
stateacttraf         1        S1  234569  stateactsplit
stateacttraf         1        S1  234569  stateactsplit
stateacttraf         2        S2  234569  stateactsplit
stateacttraf2        3        S3      99  stateacttraf2
stateacttraf2        4        S4      99  stateacttraf2

请尝试以下代码:

index_name = ['stateacttraf', 'message', 'id']
s = df.groupby(index_name).apply(lambda row: '\n '.join(map(lambda x: str(x.tolist())[1:-1], row.values)))
formatted_data = [{index_name[0]:s[i0].values[0], index_name[1]:i1, index_name[2]:i2} for i0, i1, i2 in s.index]

以下是JSON格式的数据:

[{'stateacttraf': "1, 'S1', 234569, 'stateactsplit'\n 1, 'S1', 234569, 'stateactsplit'\n 1, 'S1', 234569, 'stateactsplit'\n 2, 'S2', 234569, 'stateactsplit'",
  'message': 'stateactsplit',
  'id': 234569},
 {'stateacttraf': "3, 'S3', 99, 'stateacttraf2'\n 4, 'S4', 99, 'stateacttraf2'",
  'message': 'stateacttraf2',
  'id': 99}]

提示如果你不想发疯,我建议你换成标准的json格式

相关问题 更多 >