Транспонирование кадра данных Pandas с именем столбца вместо бросков индекса ValueError - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь показать фактическое имя столбца в json после транспонирования кадра данных, приведенный ниже код работает для LIMIT 3 в sql, но не удается, если я пытаюсь использовать LIMIT 5. Есть какие-нибудь мысли, пожалуйста?

from pandasql import *

pysqldf = lambda q: sqldf(q, globals())

q1 = """
SELECT
 beef as beef, veal as veal, pork as pork, lamb_and_mutton as lamb
FROM
 meat m
LIMIT 5;
"""

meat = load_meat()

df = pysqldf(q1)
#print(df.to_json(orient='records'))

hdf = pd.DataFrame(df)
print(hdf.T.reset_index().set_axis(range(len(hdf.columns)), axis=1, inplace=False).to_json(orient='records'))

ERROR

    'values have {new} elements'.format(old=old_len, new=new_len))
ValueError: Length mismatch: Expected axis has 6 elements, new values have 4 elements

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Попробуйте это:

df.T.reset_index()\
   .set_axis(range(len(df)+1), axis=1, inplace=False)\
   .to_json(orient='records')

Примечание. Проблема заключается в переименовании столбцов после транспонирования. Длина должна быть равна числу строк в исходном кадре данных плюс 1 для индекса.

Выход:

'[{"0":"beef","1":0,"2":4,"3":8,"4":12,"5":16},{"0":"veal","1":1,"2":5,"3":9,"4":13,"5":17},{"0":"pork","1":2,"2":6,"3":10,"4":14,"5":18},{"0":"lamb","1":3,"2":7,"3":11,"4":15,"5":29}]'
2 голосов
/ 09 мая 2019

После того, как вы T и reset_index добавили еще один columns, в то же время длина index равна columns до транспонирования, поэтому вам следует использовать shape

print(hdf.T.reset_index().set_axis(range(hdf.shape[0]+1), axis=1, inplace=False).to_json(orient='records'))
...