2016-12-16 2 views
2

У меня есть панд dataframe, который выглядит следующим образом:Вставить новые значения столбцов в dataframe с помощью MultiIndex?

  rank  num  rank num 
      2015  2015  2014 2014 
France 8  1200  9  1216 
Italy  11  789  10  788  

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

b = {2015: 10, 2014: 12} 

другими словами, я хотел бы закончить с чем-то вроде этого:

  rank  num  num_corrected rank num num_corrected 
      2015  2015  2015    2014 2014 2014 
France 8  1200  120    9  1216 101.3 
Italy  11  789  78.9    10  788 65.6 

До сих пор мой подход перебрать каждую строку в dataframe, то над каждой колонкой в ​​строке, что-то вроде этого:

for i, row in df.iterrows(): 
    for year in df.num.columns: 
     df.set_value(i, 'num_corrected, ' + year, row.frequency[year]/b[year]) 

Но когда я пытаюсь это мой Jupyter ноутбук замерзает, так что я надеясь, что есть лучший способ!

+0

Это трудно сказать, если ваши годы являются второй уровень столбика мультииндексом или нет. Можете ли вы включить код для создания вашего фрейма данных? – Alex

ответ

1

установка

df = pd.DataFrame(
    [ 
     [8, 1200, 9, 1216], 
     [11, 789, 10, 788] 
    ], 
    ['France', 'Italy'], 
    pd.MultiIndex.from_product([['rank', 'num'], [2015, 2014]]) 
).sort_index(axis=1, level=1) 

сделать b серию

b = pd.Series({2015: 10, 2014: 12}) 

Метод 1

num_c = df.num/b 

cols = num_c.columns 
num_c.columns = [['num_corrected'] * len(cols), cols] 

pd.concat([df, num_c], axis=1) 

enter image description here

метод 2

d1 = df.stack() 
d1['num_corrected'] = d1.num/d1.index.get_level_values(1).to_series().map(b).values 
d1.unstack().sort_index(axis=1, level=1) 

enter image description here