Преобразование кадра данных в Python в JSON в следующем формате - PullRequest
1 голос
/ 25 сентября 2019

Я ищу реализацию кода Python для преобразования Pandas Dataframe в json файл в формате, указанном ниже.

Входной Python Dataframe выглядит следующим образом (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  
}  

Inпример вывода \n просто означает, что каждая строка этих (1, S1, 2 , A2 , 25.5,4) должна быть напечатана в новой строке.

Пытался использовать input_data.to_json(orient='index', lines=True), но имена столбцов повторяются для каждого значения в каждой строке.

1 Ответ

1 голос
/ 25 сентября 2019

Это не очень хороший формат 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...