我的数据安排如下:
ID,DATE,STATUS
1,6/20/2011,A
1,1/14/2013,B
1,8/1/2016,C
2,3/1/2005,A
2,4/30/2005,B
2,6/30/2010,C
2,8/20/2010,D
我想将这些交易转换为年度频率不平衡的面板:
ID,YEAR,STATUS
1,2011,A
1,2012,A
1,2013,B
1,2014,B
1,2015,B
1,2016,C
2,2005,B
2,2006,B
2,2007,B
2,2008,B
2,2009,B
2,2010,D
所以基本上我想要每个ID的年度系列,涵盖从该ID开始的第一个到最后一个日期。如果当年有多个记录,则每年的状态将是该年度中观察到的最后状态,如果该年度没有日期,则为最后观察到的状态。
这是一个很大的数据集,所以一个好的答案需要使用numpy / pandas提供的有效方法。
答案 0 :(得分:2)
这是一种方式:
import pandas as pd
df = pd.read_csv('file', parse_dates=['DATE'])
df = df.set_index('DATE').resample('A').ffill()
df['YEAR'] = df.index.year
df = df.sort_values(['ID', 'YEAR']).reset_index(drop=True)
df
Out:
ID STATUS YEAR
0 1 A 2011
1 1 A 2012
2 1 B 2013
3 1 B 2014
4 1 B 2015
5 1 C 2016
6 2 B 2005
7 2 B 2006
8 2 B 2007
9 2 B 2008
10 2 B 2009
11 2 D 2010