2017-09-05 7 views
2

私はPython 3.5をWindows上で実行しており、財務計量経済学を研究するコードを書いています。マルチインデックスPandaデータフレームの別の列に基づいて新しい列を作成する

私はレベル= 0インデックスが一連の月末日で、レベル= 1インデックスが単純な整数IDであるマルチインデックスパンダデータフレームを持っています。私は値の新しい列( 'new_var')を作成したいと思います。ここでは、各月末の日付について、1ヶ月先を見て別の列( 'some_var')から値を取得します。もちろん、今月のIDは先月のIDに合わせる簡単なテストケースです。

import pandas as pd 
import numpy as np 

# Create some time series data 
id = np.arange(0,5) 
date = [pd.datetime(2017,1,31)+pd.offsets.MonthEnd(i) for i in [0,1]] 

my_data = [] 
for d in date: 
    for i in id: 
     my_data.append((d, i, np.random.random())) 

df = pd.DataFrame(my_data, columns=['date', 'id', 'some_var']) 

df['new_var'] = np.nan 
df.set_index(['date', 'id'], inplace=True) 

# Drop an observation to reflect my true data 
df.drop(('2017-02-28',3), level=None, inplace=True) 

df 

# The desired output.... 
list1 = df.loc['2017-01-31'].index.labels[1].tolist() 
list2 = df.loc['2017-02-28'].index.labels[1].tolist() 
common = list(set(list1) & set(list2)) 

for i in common: 
    df.loc[('2017-01-31', i)]['new_var'] = df.loc[('2017-02-28', i)]['some_var'] 

df 

希望の出力を得るためのより良い方法があるように感じます。たぶん私は "for"ループを受け入れるべきでしょうか?もっと良い解決策は、インデックスをリセットすることでしょうか?

は、私は、日付を表す整数列を作成し、それから、基板1(1カ月で、それをシフトする)と、元のデータフレームに戻すに残された値をマージするだろう、

F

答えて

0

をありがとう。

Out[28]: 
       some_var 
date  id   
2017-01-31 0 0.736003 
      1 0.248275 
      2 0.844170 
      3 0.671364 
      4 0.034331 
2017-02-28 0 0.051586 
      1 0.894579 
      2 0.136740 
      4 0.902409 
df = df.reset_index() 
df['n_group'] = df.groupby('date').ngroup() 
df_shifted = df[['n_group', 'some_var','id']].rename(columns={'some_var':'new_var'}) 
df_shifted['n_group'] = df_shifted['n_group']-1 
df = df.merge(df_shifted, on=['n_group','id'], how='left') 
df = df.set_index(['date','id']).drop('n_group', axis=1) 
Out[31]: 
       some_var new_var 
date  id      
2017-01-31 0 0.736003 0.051586 
      1 0.248275 0.894579 
      2 0.844170 0.136740 
      3 0.671364  NaN 
      4 0.034331 0.902409 
2017-02-28 0 0.051586  NaN 
      1 0.894579  NaN 
      2 0.136740  NaN 
      4 0.902409  NaN 
+0

非常に効率的であるように見えます。ありがとうございました。 – Fred

関連する問題