Использование имени столбца в качестве нового атрибута в пандах

У меня есть следующая структура данных

Date Agric Food 01/01/1990 1.3 0.9 01/02/1990 1.2 0.9 

Я хотел бы скрыть его в формате

 Date Sector Beta 01/01/1990 Agric 1.3 01/02/1990 Agric 1.2 01/01/1990 Food 0.9 01/02/1990 Food 0.9 

в то время как я уверен, что могу сделать это сложным образом, есть ли способ сделать это в нескольких строках кода?

3 Solutions collect form web for “Использование имени столбца в качестве нового атрибута в пандах”

Использование pd.DataFrame.melt

 df.melt('Date', var_name='Sector', value_name='Beta') Date Sector Beta 0 01/01/1990 Agric 1.3 1 01/02/1990 Agric 1.2 2 01/01/1990 Food 0.9 3 01/02/1990 Food 0.9 

Используйте set_index и stack :

 df.set_index('Date').rename_axis('Sector',axis=1).stack()\ .reset_index(name='Beta') 

Вывод:

  Date Sector Beta 0 01/01/1990 Agric 1.3 1 01/01/1990 Food 0.9 2 01/02/1990 Agric 1.2 3 01/02/1990 Food 0.9 

Или вы можете использовать lreshape

 df=pd.lreshape(df2, {'Date': ["Date","Date"], 'Beta': ['Agric', 'Food']}) df['Sector']=sorted(df2.columns.tolist()[1:3]*2) Out[654]: Date Beta Sector 0 01/01/1990 1.3 Agric 1 01/02/1990 1.2 Agric 2 01/01/1990 0.9 Food 3 01/02/1990 0.9 Food 

Если у вас 48 столбцов

 df=pd.lreshape(df2, {'Date':['Date']*2, 'Beta': df2.columns.tolist()[1:3]}) df['Sector']=sorted(df2.columns.tolist()[1:3]*2) 

также для секторов столбцов, более безопасно создавать его

 import itertools list(itertools.chain.from_iterable(itertools.repeat(x, 2) for x in df2.columns.tolist()[1:3])) 

EDIT Причина lreshap недокументирована (согласно @ Ted Petrou Лучше всего использовать доступные методы DataFrame, если это возможно, а затем, если нет доступных, использовать документированные функции. Pandas постоянно стремится улучшить свой API и вызывать недокументированные старые и экспериментальные функции, такие как lreshape, для чего угодно необоснованно. Кроме того, эта проблема – очень простая утилита для расплава или стека. Это плохой прецедент для того, чтобы те, кто был новым для панд, приходили к переполнению стека и находили оставшиеся ответы с помощью lreshape. )

Кроме того, если вы хотите узнать больше об этом, вы можете проверить его на github

Ниже приведен метод с использованием pd.wide_to_long

 dict1 = {'Agric':'A_Agric','Food':'A_Food'} df2 = df.rename(columns=dict1) pd.wide_to_long(df2.reset_index(),['A'],i='Date',j='Sector',sep='_',suffix='.').reset_index().drop('index',axis=1).rename(columns={'A':'Beta '}) Out[2149]: Date Sector Beta 0 01/01/1990 Agric 1.3 1 01/02/1990 Agric 1.2 2 01/01/1990 Food 0.9 3 01/02/1990 Food 0.9 
  • Редактировать многоформатные форматы длинного формата с помощью Pandas
  • python ravel vs. transpose при использовании в reshape
  • Numpy - нарезание 2d строк или столбцов из массива
  • Растопите верхнюю треугольную матрицу панд-кадра
  • Python - лучший язык программирования в мире.