Как преобразовать строки в столбцы, но только для части таблицы в python? - PullRequest
2 голосов
/ 05 мая 2020

У меня есть таблица, которая имеет ту же структуру, что и упрощенный пример ниже:

enter image description here

Я хотел бы преобразовать столбцы 1 и 2 в столбцы заголовки со значениями в столбцах, которые находятся в значении C1 и значении C2. Остальную часть таблицы нужно оставить без изменений. Я ожидаю, что результат будет выглядеть следующим образом:

enter image description here

Я нашел способ сделать это, используя таблицу pd.pivot, как показано ниже, но у меня есть десять столбцов таблицы для преобразования, поэтому я хочу сделать это в одном go вместо того, как показано ниже, что означает, что я должен запускать одну и ту же строку десять раз, и каждый раз это приводит к новой отдельной таблице, которую я затем должен объединить на предыдущий вывод. Возможно ли это, я попытался использовать список в столбцах и значениях pd.pivot_table, но он не работает правильно, поскольку он пытается объединить столбцы, которые я передаю в список, вместо того, чтобы просто транспонировать их. Есть ли способ транспонировать часть таблицы так, как я описал в одном go при использовании сводной таблицы, или есть другой способ, который позволил бы мне это сделать?

TABLE1=pd.DataFrame({'Name':['John','Niomi','Jack','William','Bob','Stephanie'],
     'Date Added':['05/05/2020','05/05/2020','03/04/2020','01/03/2020','10/04/2020','10/04/2020'],
     'Column 1':['A','B','C','C','A','B'],
     'C1 Value':['1','2','2','3','5','1'],
     'Column 2':['D','D','G','F','G','F'],
     'C2 Value':['5','7','9','5','2','1'],
     'Column 3':['VALUE1','VALUE2','VALUE3','VALUE4','VALUE5','VALUE6'],
     'Column 4':['VALUE7','VALUE8','VALUE9','VALUE10','VALUE11','VALUE12']})

table2=pd.pivot_table(TABLE1,index=('Name','Date Added'),columns='Column1',values='C1 Value',aggfunc='max',fill_value=0)

table3=pd.pivot_table(TABLE1,index=('Name','Date Added'),columns='Column2',values='C2 Value',aggfunc='max',fill_value=0)

table1.merge(table2,on=['Name','Date Added'])

1 Ответ

0 голосов
/ 05 мая 2020

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

def reshape(df):
        #get various variables that will be reused
        other = ['Name','Date Added','Column 3','Column 4']
        #contain column 1 and c1 value
        var1 = df.columns[df.columns.str.contains('1')].tolist()
        #contain column 2 and c2 value
        var2 = df.columns[df.columns.str.contains('2')].tolist()
        #we'll use this to replace column 1,2 and c1,2
        #allows us to merge them
        repl = ['header','vals']
                      #set indices on both var1 and 2, and concat
        res = (pd.concat([df.set_index(var1).rename_axis(index=repl).filter(other),
                          df.set_index(var2).rename_axis(index=repl).filter(other)]
                         )
               #add the remaining indices
               .set_index(other,append=True)
               #pull out the values
               .reset_index(1)
               #unstack the header column and fill nulls
               .unstack(0,fill_value=0)
              )

        return res

df.pipe(reshape)

                                                     vals
                                    header     A    B   C   D   F   G
Name         Date Added Column 3    Column 4                        
Bob         10/04/2020  VALUE5      VALUE11    5    0   0   0   0   2
Jack        03/04/2020  VALUE3      VALUE9     0    0   2   0   0   9
John        05/05/2020  VALUE1      VALUE7     1    0   0   5   0   0
Niomi       05/05/2020  VALUE2      VALUE8     0    2   0   7   0   0
Stephanie   10/04/2020  VALUE6      VALUE12    0    1   0   0   1   0
William     01/03/2020  VALUE4      VALUE10    0    0   3   0   5   0
...