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

#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