pandas df в JSON с дубликатами ключей

#json #python-3.x #pandas #duplicates

#json #python-3.x #pandas #дубликаты

Вопрос:

Я пытаюсь преобразовать df файл с уникальными ключами в JSON файл. pandas dataframe Выглядит так, как показано ниже.

 import pandas as pd

d = {'col1': [1,2,2,2,3,3], 'col2': ['a','b','c','','e','f'], 'col3': ['one','two','three','four','five','six']}

df = pd.DataFrame(data=d)

>>> df
   col1 col2   col3
0     1    a    one
1     2    b    two
2     2    c  three
3     2        four
4     3    e   five
5     3    f    six
  

Я хочу, чтобы вывод JSON выглядел следующим образом:

 {
    "1": [
      {
          "col2": "a",
          "col3": "one"
      }
  ],
    "2": [
      {
          "col2": "b",
          "col3": "two"
      },
      {
          "col2": "c",
          "col3": "three"
      },
      {
          "col2": "",
          "col3": "four"
       }
   ],
     "3": [
      {
          "col2": "e",
          "col3": "five"
      },
      {
          "col2": "f",
          "col3": "six"
      }
  ]
}
  

Как я могу добиться этого в Python? Мои попытки не работают, поскольку данные содержат дубликаты ключей.

Ответ №1:

Сначала создайте вложенные списки, преобразовав col1 в индекс, сгруппируйте по значениям индекса, и все столбцы преобразуйте в list s в лямбда-функции, последнее преобразование Series в словарь с помощью Series.to_dict :

 d = df.set_index('col1').groupby('col1').apply(lambda x: x.to_dict('r')).to_dict()
  

Другая идея — использовать понимание словаря:

 d = { k: v.to_dict(orient='records') for k, v in df.set_index(['col1']).groupby('col1')}
  


 print (d)


{
    1: [{
        'col2': 'a',
        'col3': 'one'
    }],
    2: [{
        'col2': 'b',
        'col3': 'two'
    }, {
        'col2': 'c',
        'col3': 'three'
    }, {
        'col2': '',
        'col3': 'four'
    }],
    3: [{
        'col2': 'e',
        'col3': 'five'
    }, {
        'col2': 'f',
        'col3': 'six'
    }]
}
  

Редактировать:

Если нужны col1 ключи, такие как строки:

 df['col1'] = df['col1'].astype(str)
d = df.set_index('col1').groupby('col1').apply(lambda x: x.to_dict('r')).to_dict()