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
非常に効率的であるように見えます。ありがとうございました。 – Fred