Заполнение сложенного DataFrame значениями из словаря - PullRequest
0 голосов
/ 30 марта 2019

У меня есть накопленный фрейм данных с 4 столбцами, для каждого столбца требуется определенный словарь.Для каждого столбца я хочу, чтобы соответствующий словарь заполнял все возможные строки.

Это сам фрейм данных: https://i.imgur.com/DJ1xHnc.png

, а для столбца LB словарь LB_data должен заполнить все возможные значения:

[{'Essendon': 1.32, 'St Kilda': 3.3},
 {'Carlton': 5.0, 'Port Adelaide': 1.16},
 {'Geelong Cats': 1.57, 'Melbourne': 2.36},
 {'Greater Western Sydney': 2.75, 'West Coast Eagles': 1.44},
 {'Brisbane': 1.95, 'North Melbourne': 1.85},
 {'Hawthorn': 1.38, 'Western Bulldogs': 3.0},
 {'Fremantle': 1.32, 'Gold Coast': 3.3}]

Я пытался создать новый словарь, который включает в себя составные строки, однако я не совсем уверен, как передать это в DataFrame:

{'Essendon v St Kilda': {'Essendon': 1.32, 'St Kilda': 3.3}, 'Carlton v Port Adelaide': {'Port Adelaide': 1.16, 'Carlton': 5.0}, 'Geelong Cats v Melbourne': {'Geelong Cats': 1.57, 'Melbourne': 2.36}, 'Greater Western Sydney v West Coast Eagles': {'West Coast Eagles': 1.44, 'Greater Western Sydney': 2.75}, 'Brisbane v North Melbourne': {'North Melbourne': 1.85, 'Brisbane': 1.95}, 'Hawthorn v Western Bulldogs': {'Hawthorn': 1.38, 'Western Bulldogs': 3.0}, 'Fremantle v Gold Coast': {'Gold Coast': 3.3, 'Fremantle': 1.32}}

Есть аналогичные словари для других 3 столбцов.

Как создать словари таким образом, чтобы данные можно было легко подставить в DataFrame?

Спасибо!

1 Ответ

0 голосов
/ 30 марта 2019

Сначала ваши данные должны быть в такой форме:

{column_1: {(l0_index_0, l1_index_0): value, 
            (l0_index_0, l1_index_1): value,
            (l0_index_1, l1_index_0): value...
            },
 column_2: {l0_index_0...
            }
 ...
 }

Например:

data = {'LB': {('Brisbane v Port Adelaide', 'Brisbane'): 1, ('Brisbane v Port Adelaide', 'Port Adelaide'): 2,
               ('Fremantle v St Kilda', 'Fremantle'): 3, ('Fremantle v St Kilda', 'St Kilda'): 4},
        'PB': {('Brisbane v Port Adelaide', 'Brisbane'): 5, ('Brisbane v Port Adelaide', 'Port Adelaide'): 6,
               ('Fremantle v St Kilda', 'Fremantle'): 7, ('Fremantle v St Kilda', 'St Kilda'): 8},
        'SB': {('Brisbane v Port Adelaide', 'Brisbane'): 9, ('Brisbane v Port Adelaide', 'Port Adelaide'): 10,
               ('Fremantle v St Kilda', 'Fremantle'): 11, ('Fremantle v St Kilda', 'St Kilda'): 12},
        'NEDS': {('Brisbane v Port Adelaide', 'Brisbane'): 13, ('Brisbane v Port Adelaide', 'Port Adelaide'): 14,
                 ('Fremantle v St Kilda', 'Fremantle'): 15, ('Fremantle v St Kilda', 'St Kilda'): 16},
        }

pd.DataFrame(data)

Выход:

                                        LB  PB  SB  NEDS
Brisbane v Port Adelaide Brisbane        1   5   9    13
                         Port Adelaide   2   6  10    14
Fremantle v St Kilda     Fremantle       3   7  11    15
                         St Kilda        4   8  12    16

Соответственно, поскольку ваши входные данные находятся в четырех отдельных фреймах данных, необходимо будет каким-то образом объединить их для соблюдения этого формата.

Используя LB_data, определенный в вопросе, мы можем определить простую функцию для преобразования ее в данные необходимого формата:

def transform(d):
    keys = list(d)
    combined = ' v '.join(keys)
    return {(combined, key): value for key, value in d.items()}

pd.DataFrame({'LB': {k: v for datum in LB_data for k, v in transform(datum).items()}})

Что дает это:

                                                                     LB
Brisbane v North Melbourne                 Brisbane                1.95
                                           North Melbourne         1.85
Carlton v Port Adelaide                    Carlton                 5.00
                                           Port Adelaide           1.16
Essendon v St Kilda                        Essendon                1.32
                                           St Kilda                3.30
Fremantle v Gold Coast                     Fremantle               1.32
                                           Gold Coast              3.30
Geelong Cats v Melbourne                   Geelong Cats            1.57
                                           Melbourne               2.36
Greater Western Sydney v West Coast Eagles Greater Western Sydney  2.75
                                           West Coast Eagles       1.44
Hawthorn v Western Bulldogs                Hawthorn                1.38
                                           Western Bulldogs        3.00

Выполнив ту же операцию с другими наборами входных данных и объединив результаты, вы можете получить кадр данных ожидаемого формата.

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