Создайте фрейм данных из словаря списков (который содержит словарь)

У меня есть словарь:

data1 = {
    'AI': [3, {'G': 0.0, 'C': 0.31666666666666665, 'L': 0.3333333333333333, 'U': 0.0, 'J': 0.0, 'W': 0.0, 'O1': 0.3333333333333333, 'O2': 0.016666666666666666, 'T1': 0.0, 'T2': 0.0, 'N': 0.0, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]],
    'CY': [96, {'G': 0.010416666666666666, 'C': 0.0, 'L': 0.46875, 'U': 0.0, 'J': 0.010416666666666666, 'W': 0.0, 'O1': 0.41666666666666663, 'O2': 0.020833333333333332, 'T1': 0.0, 'T2': 0.07291666666666666, 'N': 0.0, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]],
    'PY': [127, {'G': 0.0, 'C': 0.0, 'L': 0.42276422764227645, 'U': 0.008130081300813009, 'J': 0.0, 'W': 0.0, 'O1': 0.4552845528455285, 'O2': 0.04065040650406505, 'T1': 0.0, 'T2': 0.04878048780487805, 'N': 0.020325203252032523, 'B': 0.0040650406504065045, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]],
    'SR': [1, {'G': 0.0, 'C': 0.0, 'L': 0.0, 'U': 0.0, 'J': 0.0, 'W': 0.0, 'O1': 0.0, 'O2': 1.0, 'T1': 0.0, 'T2': 0.0, 'N': 0.0, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.33333333333333337, 0.33333333333333337, 0.33333333333333337]],
    'CV': [119, {'G': 0.03022827836191888, 'C': 0.09570154943733565, 'L': 0.1787022898077257, 'U': 0.059038954704106396, 'J': 0.01667767082036904, 'W': 0.0008338835410184519, 'O1': 0.46697478297033307, 'O2': 0.03193607185392467, 'T1': 0.0, 'T2': 0.08238175915743774, 'N': 0.0208470885254613, 'B': 0.00833883541018452, 'R': 0.0, 'D': 0.00833883541018452, 'M': 0.0}, [0.33216690905268464, 0.3354010574206815, 0.3324320335266338]],
    'BS': [65, {'G': 0.024576271186440683, 'C': 0.1033898305084746, 'L': 0.08576271186440679, 'U': 0.37796610169491535, 'J': 0.016949152542372885, 'W': 0.0, 'O1': 0.21864406779661022, 'O2': 0.07271186440677968, 'T1': 0.050847457627118654, 'T2': 0.013559322033898308, 'N': 0.016949152542372885, 'B': 0.0016949152542372885, 'R': 0.0, 'D': 0.016949152542372885, 'M': 0.0}, [0.3346524499339513, 0.3346524499339513, 0.33069510013209746]],
    'RD': [24, {'G': 0.041666666666666664, 'C': 0.0, 'L': 0.29166666666666663, 'U': 0.0, 'J': 0.0, 'W': 0.0, 'O1': 0.5833333333333333, 'O2': 0.041666666666666664, 'T1': 0.0, 'T2': 0.0, 'N': 0.041666666666666664, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]]
}

Форма:

d1 = {
    A1: [n1, {B1: m1, B2: m2, ...}, [p1, q1, r1]],
    ...
}

Я хочу создать фрейм данных, который содержит ключи верхнего уровня (A) словаря в виде строк (поэтому они образуют первый столбец фрейма данных), а ключи внутреннего уровня (B) в качестве столбцов. Клавиши B не меняются от записи к записи. Значения m должны быть значениями ячеек.

Какой самый питонический способ добиться этого?

Я прочитал Создайте фрейм данных pandas из словаря словарей, но словарь здесь вложен внутри списка, а это простой словарь словарей. Не сравнимо.

Значит, n, p, q, r следует игнорировать?

wjandrea 14.06.2024 15:13

Что вы подразумеваете под «самым питоническим»? Знаете ли вы какой-нибудь способ сделать это? Мол, вы знакомы с pd.DataFrame.from_dict()?

wjandrea 14.06.2024 15:16

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

wjandrea 14.06.2024 15:37

@wjandrea Я ценю помощь в перефразировании моего вопроса, но чувствую, что иногда это неуместно. Большинству людей известен способ ведения дел «грубой силой». Однако в Python всегда существует элегантный однострочный метод выполнения действий, например, предложенный Ouroboros1. Это то, что большинство людей имеют в виду, когда говорят «питонический».

user2751530 14.06.2024 19:59

@user2751530 user2751530 это грубый способ

juanpa.arrivillaga 14.06.2024 20:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать pd.DataFrame.from_dict с orient='index':

out = pd.DataFrame.from_dict({k: v[1] for k, v in data1.items()}, orient='index')

Выход:

           G         C         L         U         J         W        O1  \
AI  0.000000  0.316667  0.333333  0.000000  0.000000  0.000000  0.333333   
CY  0.010417  0.000000  0.468750  0.000000  0.010417  0.000000  0.416667   
PY  0.000000  0.000000  0.422764  0.008130  0.000000  0.000000  0.455285   
SR  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   
CV  0.030228  0.095702  0.178702  0.059039  0.016678  0.000834  0.466975   
BS  0.024576  0.103390  0.085763  0.377966  0.016949  0.000000  0.218644   
RD  0.041667  0.000000  0.291667  0.000000  0.000000  0.000000  0.583333   

          O2        T1        T2         N         B    R         D    M  
AI  0.016667  0.000000  0.000000  0.000000  0.000000  0.0  0.000000  0.0  
CY  0.020833  0.000000  0.072917  0.000000  0.000000  0.0  0.000000  0.0  
PY  0.040650  0.000000  0.048780  0.020325  0.004065  0.0  0.000000  0.0  
SR  1.000000  0.000000  0.000000  0.000000  0.000000  0.0  0.000000  0.0  
CV  0.031936  0.000000  0.082382  0.020847  0.008339  0.0  0.008339  0.0  
BS  0.072712  0.050847  0.013559  0.016949  0.001695  0.0  0.016949  0.0  
RD  0.041667  0.000000  0.000000  0.041667  0.000000  0.0  0.000000  0.0  

Спасибо. Это почти идеально. Как передать строку заголовка первому столбцу (содержащему «AI» и т. д.)?

user2751530 14.06.2024 15:30

Вы можете связать df.rename_axis: .rename_axis(index='index_name').

ouroboros1 14.06.2024 15:35

Оказалось, что мне это не нужно. В любом случае спасибо, что ответили на мой вопрос.

user2751530 14.06.2024 20:32

Я думаю, вы только что перепутали индекс со столбцом. В out выше «AI» и т. д. являются значениями индекса, и чтобы присвоить индексу имя/метку, вы можете использовать rename_axis. Если вы затем захотите выбрать его в качестве столбца, вам сначала нужно сделать его таковым. Например. используя .reset_index(): out.rename_axis(index='not_a_column').reset_index()['not_a_c‌​olumn']

ouroboros1 14.06.2024 20:37

Другие вопросы по теме

Я продолжаю получать ошибку «функция не повторяется» с фильтром Pandas DataFrame, но та же функция работает с применением. Что мне не хватает?
Вернуть имя столбца, соответствующее значению даты
Объединить/объединить несколько фреймов данных pandas со смешиванием значений в одном столбце
Связывание столбцов двух кадров данных разной длины в R tidyverse с сгруппированными векторами
Невозможно преобразовать данные столбца и сохранить их в одном новом столбце в пандах фрейма данных
Каков наиболее эффективный способ заполнения нескольких столбцов значениями из других столбцов таким образом, чтобы их можно было соединить с суффиксом?
Создание таблицы частот для каждого столбца в фрейме данных с помощью цикла и сохранение результатов в списке
Объедините две таблицы, если заданное значение переменной является частью другой переменной
Табуляция столбца в data.frame, игнорируя порядок элементов в нем в R
Как я могу объединить два кадра данных на основе последней даты каждой группы?