【问题标题】:Converting dataframe in python to json in the below format将python中的数据帧转换为以下格式的json
【发布时间】:2019-09-25 15:04:51
【问题描述】:

我正在寻找一个 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),但每行中的每个值都会重复列名。

【问题讨论】:

  • 这不是一个好的json 格式。 Working with JSON
  • @Trenton_M 不幸的是,这是我收到的以该格式实施的要求。
  • 这真的很不幸,但看起来有人提供了解决方案。

标签: python json dataframe apache-kafka


【解决方案1】:

这不是一个好的 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}]

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

【讨论】:

  • 非常感谢这个解决方案。我对此只有两个问题:1)\ n - >暗示这是在kafka从这个文件中读取时换行符而不是字符串字符,对吗? 2) formatted_data 在技术上是一个列表,所以如果我必须转换为 json 才能通过 kafka 发布;那么这将正常工作my_json_string = json.dumps(formatted_data)。或者通过 kafka 发布的列表(即 formatted_data)本身就足够了?
  • 我希望我可以,会简单得多,但这是我收到的要求,没有任何偏差的余地。
  • 1) 应该如你所说。 2)json.dumps (formatted_data)将字典转换成字符串,按照标准json规则格式化。由于 python 字典是formatted_datastr(formatted_data) 也可能就足够了。我从来没有大量使用过卡夫卡。试着让我知道:-)。如果我的评论对您有帮助,请接受并投票支持我的回答。谢谢
  • 我告诉过你,str(formatted_data) 应该更正,看这里:stackoverflow.com/questions/50565380/…
  • 完美,然后考虑接受我的回答,谢谢@Datta
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 2017-10-10
  • 2020-09-06
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多