У меня есть такой диктат:
{'id': '123', 'sales_attributes': [], 'seller_sku': '123'}
Я хочу создать фрейм данных для его хранения. Когда я использую pd.DataFrame(), он генерирует пустой фрейм данных.
Когда я использую pd.json_normalize(), я получил желаемые результаты
Почему? Может кто-нибудь мне помочь?
Вам придется обернуть все в списки:
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: []
хотя документация называет их «константами»: «Dict может содержать серии, массивы, константы, классы данных или объекты, подобные спискам».
@juanpa.arrivillaga, спасибо, это очень веская мысль. Я попытался отредактировать ответ, заменив «литералы» на «скаляры/константы», к сожалению, это не удалось (я получаю сообщение «Произошла ошибка при отправке редактирования», возможно, из-за этой ошибки). Не могли бы вы попробовать отредактировать его?
Я думаю, вы имеете в виду «скаляр», а не «буквальный».