#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