あなたは将来を埋めるためにffill
をdate
インデックスを作成して、日付を拡大するreindex
を使用して可能性がありNaNを:
def expand_dates(grp):
start = grp.index.min()
end = today
index = pd.date_range(start, end, freq='D')
return grp.reindex(index).ffill()
使用groupby/apply
グループごとに一度expand_dates
を呼び出しますdf = df.ffill()
:最後のステップとして、私の最初の答えは前方に満ちた全体のデータフレーム:
df = df.groupby('country')['gd'].apply(expand_dates)
補正:し、結果を連結します。これは、各国の最初のgd
値がNaN
でない場合にのみ正しいです。特定の国の開始行にNaN
gd
の値がある場合、前方に塗りつぶすと、他の国の値を持つgd
の値が汚染される可能性があります。 Yikes。より強固で正確な方法は、グループごとに1回ずつ順方向に塗りつぶすことです(shown by piRSquared)。小規模なDataFramesで何度でも代わりにフォワードフィリングを実行することで達成されるパフォーマンスの向上は、フィールコールの数が国の数(かなり低い数値)によって制限され、潜在的なバグに対する安全防御がはるかに重要であるため、可能な制限された性能向上よりも優れています。
import numpy as np
import pandas as pd
df = pd.DataFrame({'country': ['US', 'US', 'US', 'UK', 'UK', 'UK'], 'date': ['01-01-2014', '01-01-2015', '01-01-2013', '01-01-2000', '02-01-2001', '01-01-2016'], 'gd': [2.0, 3.0, 0.4, 0.7, 0.5, 1.0]})
df['date'] = pd.to_datetime(df['date'])
today = pd.Timestamp('today')
def expand_dates(grp):
start = grp.index.min()
end = today
index = pd.date_range(start, end, freq='D')
return grp.reindex(index).ffill()
df = df.set_index('date')
df = df.groupby('country')['gd'].apply(expand_dates)
print(pd.concat([df.head(), df.tail()]))
利回り
country
UK 2000-01-01 0.7
2000-01-02 0.7
2000-01-03 0.7
2000-01-04 0.7
2000-01-05 0.7
US 2017-07-14 3.0
2017-07-15 3.0
2017-07-16 3.0
2017-07-17 3.0
2017-07-18 3.0
Name: gd, dtype: float64