Добавление среднего столбца в мультииндексный кадр данных Pandas - PullRequest
0 голосов
/ 06 сентября 2018

у меня есть датафрейм df

first        bar                 baz           
second       one       two       one       two 
A       0.487880 -0.487661 -1.030176  0.100813 
B       0.267913  1.918923  0.132791  0.178503
C       1.550526 -0.312235 -1.177689 -0.081596 

Я хотел бы добавить средние столбцы, а затем переместить среднее значение вперед

df['Average'] = df.mean(level='second', axis='columns')  #ERROR HERE
cols = df.columns.tolist()
df = df[[cols[-1]] + cols[:-1]]

Я получаю ошибку:

ValueError: Wrong number of items passed 2, placement implies 1

Может быть, я мог бы добавить каждый столбец df['Average', 'One'] = ... в среднем по одному за раз, но это кажется глупым, особенно с учетом того, что индекс реальной жизни более сложен.

Редактировать: ( Генерация кадров )

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
    ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

pandas.concat

df.join(pd.concat([df.mean(level='second', axis='columns')], axis=1, keys=['Average']))

first        bar                 baz             Average          
second       one       two       one       two       one       two
A       0.255301  0.286846  1.027024 -0.060594  0.641162  0.113126
B      -0.608509 -2.291201  0.675753 -0.416156  0.033622 -1.353679
C       2.714254 -1.330621 -0.099545  0.616833  1.307354 -0.356894

stack / unstack

Не обязательно эффективный, но аккуратный

df.stack().assign(Average=df.mean(level='second', axis='columns').stack()).unstack()

first        bar                 baz             Average          
second       one       two       one       two       one       two
A       0.255301  0.286846  1.027024 -0.060594  0.641162  0.113126
B      -0.608509 -2.291201  0.675753 -0.416156  0.033622 -1.353679
C       2.714254 -1.330621 -0.099545  0.616833  1.307354 -0.356894
0 голосов
/ 06 сентября 2018

Я не уверен в вашем целевом выводе.Что-то вроде этого?

df2 = df.mean(level='second', axis='columns')
df2.columns = pd.MultiIndex.from_tuples([('mean', col) for col in df2])
>>> df2
       mean          
        one       two
A -0.271148 -0.193424
B  0.200352  1.048713
C  0.186419 -0.196915

>>> pd.concat([df2, df], axis=1)
       mean                 bar                 baz          
        one       two       one       two       one       two
A -0.271148 -0.193424  0.487880 -0.487661 -1.030176  0.100813
B  0.200352  1.048713  0.267913  1.918923  0.132791  0.178503
C  0.186419 -0.196915  1.550526 -0.312235 -1.177689 -0.081596

Вы получаете ошибку, потому что ваша операция mean приводит к кадру данных (с двумя столбцами в данном случае).Затем вы пытаетесь присвоить этот результат одному столбцу в исходном кадре данных.

...