Добавьте столбец к мультииндексу как отношение двух других столбцов уровня = 0 - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть DataFrame с MultiIndex:

MultiIndex(levels=[['field1', 'field2'], ['product1','product2','product3']],
           codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2]],
           names=['metric', 'label'])

Имея import pandas as pd, я могу ссылаться и использовать:

idx = pd.IndexSlice
data.loc[:,idx['field1',:]].tail()
#and
data.loc[:,idx['field2',:]].tail()

Теперь я немного застрял, когда я думаю о добавлении field3 к моему DataFrame (data), который я хочу, чтобы быть отношение двух полей:

#This works and gives me the output I'd want:
(data.loc[:,idx['field1']] / (data.loc[:,idx['field2']]))

Но, неясно, как добавить это в мой мультииндекс, как обе эти команды:

data.loc[:,['field3',:]] =  quarterly_data.loc[:,idx['accountsreceivable']].div(quarterly_data.loc[:,idx['revenue']]/90)

data.loc[:,['field3']] =  quarterly_data.loc[:,idx['accountsreceivable']].div(quarterly_data.loc[:,idx['revenue']]/90)

Не работают. Они дают мне новый level=0 MultiIndex, который является field3, но level=1 Multi-Index, который применяется только к одному столбцу, где level=1 равен ''.

Например:

MultiIndex(levels=[['field1', 'field2', 'field3'], ['product1', 'product2','']],...

Теперь, если я укажу:

data.loc[:,idx['field3','product1']] =  data.loc[:,idx['field1','product1']]/(data.loc[:,idx['field2','product1']])

Это работает, но только для product1. Как бы я сделал это для ВСЕХ : продуктов одновременно? Итерации по всем product{s} кажутся слишком не- pandas, чтобы быть приемлемым ответом. Я также попытался использовать div вместо /, но это не имело значения.

1 Ответ

0 голосов
/ 14 апреля 2020

Создайте MultiIndex для нового DataFrame и добавьте к оригиналу:

idx = pd.IndexSlice
df = (data.loc[:,idx['field1']] / (data.loc[:,idx['field2']]))
df.columns = pd.MultiIndex.from_product([['new'], df.columns])

data = data.join(df)

Другой способ - создать столбцы путем изменения их формы на DataFrame.stack, обработки и последующего изменения формы:

df = data.stack()
df['new'] = df['field1'] / df['field2']

df = df.unstack()
...