Группировка и отступ json, созданный из pandas dataframe - PullRequest
0 голосов
/ 02 сентября 2018

У меня в настоящее время есть кадр данных, подобный следующему:

   ln    7,26    7,27    7,28       name
26443       G       G       G  Product 1
27953       G       G       G  Product 2

Это от csv, который генерируется ежедневно, а числа (7,26; 7,27 ...) являются датами, что означает, что они отличаются каждый день. Я хотел бы создать JSON, который выглядит следующим образом:

[{
    "index": 0,
    "ln": "26443",
    "availability": {
        "7,26": "G",
        "7,27": "G",
        "7,28": "G",
    },
    "name": "Product 1"
}, {
    "index": 1,
    "ln": "27953",
    "availability": {
        "7,26": "G",
        "7,27": "G",
        "7,28": "G",
    },
    "name": "Product 2"
}]

Текущий код, который я использую для создания json, похож на следующий, но он просто выводит все как есть:

with open('output.json', 'w', encoding='utf-8') as file:
    df2.reset_index().to_json(file, orient='records', force_ascii=False)

Возможно ли это сделать? Если да, то как?

Заранее спасибо за любой совет!

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Использование:

#specify columns for converting to dict
diff_cols = df.columns.difference(['ln','name'])

#create list of dictionaries
L = df[diff_cols].to_dict(orient='records')

#remove columns converted to list, add it to new column and convert to json
out = (df.reset_index()
       .drop(diff_cols, axis=1)
       .assign(availability=pd.Series(L))
       .to_json(orient='records'))
print (out)

[{
    "index": 0,
    "ln": 26443,
    "name": "Product 1",
    "availability": {
        "7,26": "G",
        "7,27": "G",
        "7,28": "G"
    }
}, {
    "index": 1,
    "ln": 27953,
    "name": "Product 2",
    "availability": {
        "7,26": "G",
        "7,27": "G",
        "7,28": "G"
    }
}]
0 голосов
/ 02 сентября 2018

pandas не предоставляет такой формат. Самое простое решение это:

import json
json.dumps(json.loads(df.to_json(orient='table'))['data'])
0 голосов
/ 02 сентября 2018

Вы можете использовать

In [672]: cols = ['7,26', '7,27', '7,28']

In [673]: dff = df.assign(availability=df[cols].apply(dict, 1)).reset_index()

In [674]: dff[dff.columns.difference(cols)].to_dict('r')
Out[674]:
[{'availability': {'7,26': 'G', '7,27': 'G', '7,28': 'G'},
  'index': 0,
  'ln': 26443,
  'name': 'Product 1'},
 {'availability': {'7,26': 'G', '7,27': 'G', '7,28': 'G'},
  'index': 1,
  'ln': 27953,
  'name': 'Product 2'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...