Как создать DataFrame с многоуровневыми столбцами? - PullRequest
0 голосов
/ 13 апреля 2020

Существующий вопрос, Создание Pandas кадра данных с индексом по нескольким столбцам , имеет дело с очень «обычным» DataFrame, где все столбцы и строки являются продуктами, а все данные присутствуют.

Моя ситуация, увы, другая. У меня есть такие данные:

[{"street": "Euclid", "house":42, "area":123, (1,"bedrooms"):1, (1,"bathrooms"):4},
 {"street": "Euclid", "house":19, "area":234, (2,"bedrooms"):3, (2,"bathrooms"):3},
 {"street": "Riemann", "house":42, "area":345, (1,"bedrooms"):5,
  (1,"bathrooms"):2, (2,"bedrooms"):12, (2, "bathrooms"):17},
 {"street": "Riemann", "house":19, "area":456, (1,"bedrooms"):7, (1,"bathrooms"):1}]

, и я хочу, чтобы этот тип DataFrame с обоими строками и столбцами, имеющими многоуровневые индексы:

              area          1                  2
street house        bedrooms bathrooms bedrooms bathrooms
Euclid  42    123     1         4
Euclid  19    234                         3         3
Riemann 42    345     5         2        12        17
Riemann 19    456     7         1

Итак, индекс строки должен быть

MultiIndex([("Euclid",42),("Euclid",19),("Riemann",42),("Riemann",19)],
           names=["street","house"])

, а индекс столбцов должен быть

MultiIndex([("area",None),(1,"bedrooms"),(1,"bathrooms"),(2,"bedrooms"),(2,"bathrooms")],
           names=["floor","entity"])

, и я не вижу способа генерировать эти индексы из списка словарей у меня есть.

1 Ответ

1 голос
/ 13 апреля 2020

я чувствую, что должно быть что-то лучше этого; надеюсь, кто-то на SO выдает sth намного лучше:

Создайте функцию для обработки каждой записи в словаре:

def process(entry):
    #read in data and get the keys to be the column names
    m = pd.DataFrame.from_dict(entry,orient='index').T
    #set index
    m = m.set_index(['street','house'])
    #create multi-index columns
    col1 = [ent[0] if isinstance(ent,tuple) else ent for ent in m.columns ]
    col2 = [ent[-1] if isinstance(ent,tuple) else None for ent in m.columns ]
    #assign multi-index column to m
    m.columns=[col1,col2]
    return m

Примените вышеуказанную функцию к данным (я завернул словарь в data variable):

res = [process(entry) for entry in data]

объединить для получения окончательного результата

pd.concat(res)

                area               1                  2
                NaN    bedrooms bathrooms   bedrooms    bathrooms
street  house                   
Euclid    42    123     1        4           NaN         NaN
          19    234     NaN      NaN         3           3
Riemann   42    345     5        2           12          17
          19    456     7        1           NaN         NaN
...