#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
Как мне взять обычный фрейм данных, например, следующий:
pd.DataFrame(columns=['X', 'Y'],index=['A','B'])
X Y
A 1 2
B 3 4
и создайте новый фрейм данных, в котором каждая строка состоит из ячейки, имени столбца и индекса, как показано ниже:
col1 col2 col3
row0 1 X A
row1 2 Y A
row2 3 X B
row3 4 Y B
Любая помощь приветствуется.
Ответ №1:
Используйте DataFrame.stack
для изменения формы, затем DataFrame.rename_axis
для новых имен столбцов, DataFrame.reset_index
для MultiIndex Series
DataFrame
, при необходимости переименуйте индекс и измените порядок столбцов на DataFrame.reindex
:
df = (df.stack()
.rename_axis(('col3','col2'))
.reset_index(name='col1')
.rename(lambda x: f'row{x}')
.reindex(['col1','col2','col3'], axis=1))
print (df)
col1 col2 col3
row0 1 X A
row1 2 Y A
row2 3 X B
row3 4 Y B
Решение Numpy / pandas — numpy.ravel
, numpy.tile
, numpy.repeat
с DataFrame
конструктором:
df = pd.DataFrame({'col1': df.to_numpy().ravel(),
'col2': np.tile(df.columns,len(df.index)),
'col3': np.repeat(df.index,len(df.columns))}).rename(lambda x: f'row{x}')
print (df)
col1 col2 col3
row0 1 X A
row1 2 Y A
row2 3 X B
row3 4 Y B