2016-09-19 6 views
1

Это кажется таким простым, что я не могу поверить, что я тяну свои волосы. У меня есть pivot_table как этотСоздайте новый столбец на pandas pivot_table с помощью multiindex

 
Name  income   expenses 
     2015 2016  2015 2016 
Joe Doe  2  4   5  7 
Jane Doe 2  4   5  7 
Doe Joe  2  4   5  7 
Doe Jane 2  4   5  7 

Я просто хочу, чтобы добавить вычисляемый столбец profit_loss = (доходы - расходы) Я думал, что это будет что-то вроде:

df['profit_loss'] = df['income'] - df['expenses] 

я только получаю ошибки.

Не нужно писать много кода или подготовку к базовой таблице, которая создает эту таблицу pivot_table, есть ли более простой способ иметь дело с MultiIndexes на pandas pivot_table?

+0

может вы [сообщение] (http://stackoverflow.com/posts/39581185/edit) вывод 'df.to_dict()', поэтому нам было бы проще создать многоиндексный DF? – MaxU

ответ

0

Вы можете использовать первый sort_index, потому что ошибка:

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)'

Затем используйте slicers и последний concata оригинальному df:

df.sort_index(axis=1, inplace=True) 

idx = pd.IndexSlice 
a = df.loc[:,idx['income',:]] - df.loc[:,idx['expenses',:]].values 
#rename column name 
a = a.rename(columns={'income':'profit_loss'}) 
print (a) 
     profit_loss  
       2015 2016 
Joe Doe   -3 -3 
Jane Doe   -3 -3 
Doe Joe   -3 -3 
Doe Jane   -3 -3 

df1 = pd.concat([df,a], axis=1) 
print (df1) 
     expenses  income  profit_loss  
      2015 2016 2015 2016  2015 2016 
Joe Doe   5 7  2 4   -3 -3 
Jane Doe  5 7  2 4   -3 -3 
Doe Joe   5 7  2 4   -3 -3 
Doe Jane  5 7  2 4   -3 -3 
+0

Если мой ответ был полезен, не забудьте [принять] (http://meta.stackexchange.com/a/5235/295067). Благодарю. – jezrael