Почему передача dict в pd.DataFrame() генерирует пустой фрейм данных?

У меня есть такой диктат:

{'id': '123', 'sales_attributes': [], 'seller_sku': '123'}

Я хочу создать фрейм данных для его хранения. Когда я использую pd.DataFrame(), он генерирует пустой фрейм данных.

Когда я использую pd.json_normalize(), я получил желаемые результаты

Почему? Может кто-нибудь мне помочь?

Почему в 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
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам придется обернуть все в списки:

dic = {'id': ['123'], 'sales_attributes': [[]], 'seller_sku': ['123']}
print(pd.DataFrame(dic))

    id sales_attributes seller_sku
0  123               []        123

Почему?

Когда вы передаете словарь конструктору DataFrame, он ожидает, что списки будут элементами, причем все списки будут иметь одинаковую длину:

dic = {'id': ['123', '456'], 'seller_sku': ['123', '456']}
df = pd.DataFrame(dic)

    id seller_sku
0  123        123
1  456        456

Для удобства вы также можете передавать литералы, и они будут расширены на все строки:

dic = {'id': ['123', '456'], 'seller_sku': ['123', '456'], 'other': 'X'}
df = pd.DataFrame(dic)

    id seller_sku other
0  123        123     X
1  456        456     X

Любой другой формат не будет работать, например, нечетные списки или только литералы:

dic = {'id': ['123', '456'], 'seller_sku': ['123']}
print(pd.DataFrame(dic))
# ValueError: All arrays must be of the same length

dic = {'id': '123', 'seller_sku': '123'}
print(pd.DataFrame(dic))
# ValueError: If using all scalar values, you must pass an index

В вашем случае есть один атрибут, определяющий количество строк (0) и 2 литерала, поэтому вывод представляет собой пустой DataFrame:

dic = {'id': '123', 'sales_attributes': [], 'seller_sku': '123'}
df = pd.DataFrame(dic)

Empty DataFrame
Columns: [id, sales_attributes, seller_sku]
Index: []

Я думаю, вы имеете в виду «скаляр», а не «буквальный».

juanpa.arrivillaga 21.05.2024 10:35

хотя документация называет их «константами»: «Dict может содержать серии, массивы, константы, классы данных или объекты, подобные спискам».

juanpa.arrivillaga 21.05.2024 10:44

@juanpa.arrivillaga, спасибо, это очень веская мысль. Я попытался отредактировать ответ, заменив «литералы» на «скаляры/константы», к сожалению, это не удалось (я получаю сообщение «Произошла ошибка при отправке редактирования», возможно, из-за этой ошибки). Не могли бы вы попробовать отредактировать его?

mozway 21.05.2024 11:45

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