Как добавить новую группу столбцов после использования пивота pandas? - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь создать новую группу столбцов, состоящую из 3 подколонок после использования pivot в кадре данных, но в результате получается только один столбец.

Допустим, у меня есть следующий кадр данных, который Я поворачиваюсь:

df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
                           'two'],
                   'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'baz': [1, 2, 3, 4, 5, 6],
                   'zoo': [1, 2, 3, 4, 5, 6]})
df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])

Теперь мне нужна дополнительная группа столбцов, которая является суммой двух столбцов значений baz и zoo .

Мой вывод:

df.loc[:, "baz+zoo"] = df.loc[:,'baz'] + df.loc[:,'baz']

My output

Требуемый вывод:

enter image description here

Я знаю, что выполнение суммы, а затем конкатенация добьются цели, но я надеялся на более точное решение.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Я думаю, если много строк или в основном много столбцов лучше / быстрее, создайте новый DataFrame и добавьте первый уровень MultiIndex на MultiIndex.from_product и добавьте к оригиналу на DataFrame.join :

df1 = df.loc[:,'baz'] + df.loc[:,'zoo']
df1.columns = pd.MultiIndex.from_product([['baz+zoo'], df1.columns])
print (df1)
   baz+zoo        
          A   B   C
foo                
one       2   4   6
two       8  10  12

df = df.join(df1)
print (df)
    baz       zoo       baz+zoo        
bar   A  B  C   A  B  C       A   B   C
foo                                    
one   1  2  3   1  2  3       2   4   6
two   4  5  6   4  5  6       8  10  12

Другое решение - l oop по вторым уровням и выбор MultiIndex по кортежам, но если большая производительность DataFrame должна быть хуже, лучший тест с реальными данными:

for x in df.columns.levels[1]:
    df[('baz+zoo', x)] = df[('baz', x)] + df[('zoo', x)]
print (df)
    baz       zoo       baz+zoo        
bar   A  B  C   A  B  C       A   B   C
foo                                    
one   1  2  3   1  2  3       2   4   6
two   4  5  6   4  5  6       8  10  12
0 голосов
/ 10 апреля 2020

Я тоже смог это сделать. Я не уверен, что понимаю теорию, но ...

df['baz+zoo'] = df['baz']+df['zoo']
df.pivot(index='foo', columns='bar', values=['baz','zoo','baz+zoo'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...