Преобразование фрейма данных Pandas в формат JSON: как группировать

#python #json #pandas #dataframe

#python #json #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных Pandas:

      nodes        x      y        z
0        1   0.0000  0.000   0.0000
1        2   0.0000  9.144   0.0000
2        3  19.5072  0.000   0.0000
3        4  19.5072  9.144   0.0000
4        5   9.7536  0.000   0.0000
..     ...      ...    ...      ...
175    176  19.5072  9.144  27.7368
176    177  19.5072  9.144  25.7556
177    178  19.5072  9.144  21.7932
178    179  19.5072  9.144  19.8120
179    180  19.5072  9.144  17.8308
  

для преобразования в JSON:

 {
    "nodes": {
        "1": {
            "x": 0,
            "y": 0,
            "z": 0
        },
        "2": {
            "x": 0,
            "y": 9.144,
            "z": 0
        },
        "3": {
            "x": 19.5072,
            "y": 0,
            "z": 0
        },
        "4": {
            "x": 19.5072,
            "y": 9.144,
            "z": 0
        },
        "5": {
            "x": 9.7536,
            "y": 0,
            "z": 0
        },
    },
}
  

Я только начал использовать python. После Google я попытался:

 out = df.to_json(orient = 'records')
print(json.dumps(json.loads(out), indent=4))
  

Это привело к:

 {
    "nodes": 1,
    "x": 0.0,
    "y": 0.0,
    "z": 0.0
},
{
    "nodes": 2,
    "x": 0.0,
    "y": 9.144,
    "z": 0.0
},
{
    "nodes": 3,
    "x": 19.5072,
    "y": 0.0,
    "z": 0.0
},
  

Пожалуйста, помогите. Спасибо.

Ответ №1:

Вы можете воспользоваться этой groupby функцией для достижения желаемого результата:

 out = {'nodes': df.groupby('nodes').last().to_dict(orient='index')}
print(json.dumps(out, indent=4))
  

Результаты в:

 {
    "nodes": {
        "1": {
            "x": 0.0,
            "y": 0.0,
            "z": 0.0
        },
        "2": {
            "x": 0.0,
            "y": 9.144,
            "z": 0.0
        },
        "3": {
            "x": 19.5072,
            "y": 0.0,
            "z": 0.0
        },
        "4": {
            "x": 19.5072,
            "y": 9.144,
            "z": 0.0
        },
        "5": {
            "x": 9.7536,
            "y": 0.0,
            "z": 0.0
        }
    }
}
  

Комментарии:

1. @ drec4s. Это работает. Спасибо. Не могли бы вы рассказать о функции .last() ?

2. out = {'nodes': df.groupby('nodes').last().to_dict(orient='index')} сработало; в противном случае вы получите предупреждение FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.