Правильно транспонируйте фрейм данных Pandas и получите доступ к первому столбцу

#python #pandas

#питон #панды

Вопрос:

У меня есть фрейм данных, который я читаю из csv-файла, выглядит так:

 original = pd.read_csv("fruit.csv")  print(original)  fruit apple banana pear 0 weight 50 45 48 1 price 100 150 200 2 calories 10 50 40  

Я хотел бы перенести его так, чтобы я мог получить доступ к категориям, которые сейчас находятся в строке «фрукты», в качестве их собственных столбцов, т. Е. Вот так:

 print(transposed['fruit'])  0 apple 1 banana 2 pear  

Такие, что я могу делать такие вещи, как print(transposed[transposed['fruit']=='apple']['weight'])

Если я попытаюсь просто перенести фрейм данных, я не смогу получить доступ к первому столбцу ( KeyError: 'fruit' ). Я перепробовал все виды манипуляций с фреймом данных, но либо индекс запутывается, либо имя первого столбца удаляется (когда я reset_index() , «фрукт» по какой-то причине становится «индексом»).

Комментарии:

1. вы не должны transposed[transposed['fruit']=='apple']['weight'] этого делать, но использовать loc лучше transposed.loc[transposed['fruit']=='apple', 'weight'] . почему? если вы это сделаете transposed[transposed['fruit']=='apple']['weight'] = 99 , вы сможете увидеть причину

Ответ №1:

IIUC, заданный fruit в качестве индекса; выбор должен быть намного проще:

 temp = df.set_index('fruit') temp.loc['weight', 'apple'] 50  

Комментарии:

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

Ответ №2:

Использовать melt и pivot :

 gt;gt;gt; df.melt('fruit').pivot('variable', 'fruit', 'value')   .rename_axis(index='fruit', columns=None).reset_index()   fruit calories price weight 0 apple 10 100 50 1 banana 50 150 45 2 pear 40 200 48  

Ответ №3:

Другой способ:

 transposed = df.T.reset_index().set_axis(df.T.reset_index().iloc[0], axis=1).iloc[1:].rename_axis(None, axis=1)  

Выход:

 gt;gt;gt; transposed  fruit weight price calories 1 apple 50 100 10 2 banana 45 150 50 3 pear 48 200 40  gt;gt;gt; transposed[transposed['fruit']=='apple']['weight'] 1 50 Name: weight, dtype: object