几行多一点,但是我认为这导致了您的要求:
从数据框开始:
In [70]: dfOut[70]: start_date end_date val rowtickerAAPL 2014-05-01 2014-05-01 10 0AAPL 2014-06-05 2014-06-10 20 1GOOG 2014-06-01 2014-06-15 50 2MSFT 2014-06-16 2014-06-16 NaN 3TWTR 2014-01-17 2014-05-17 10 4
首先,我重塑这个数据帧的数据帧与一个
date列(所以每一行重复的每个日期两次
start_date和
end_date(我所谓的添加计数器列
row):
In [60]: df['row'] = range(len(df))In [61]: starts = df[['start_date', 'val', 'row']].rename(columns={'start_date': 'date'})In [62]: ends = df[['end_date', 'val', 'row']].rename(columns={'end_date':'date'})In [63]: df_decomp = pd.concat([starts, ends])In [64]: df_decomp = df_decomp.set_index('row', append=True)In [65]: df_decomp.sort_index()Out[65]: date valticker rowAAPL 0 2014-05-01 10 0 2014-05-01 10 1 2014-06-05 20 1 2014-06-10 20GOOG 2 2014-06-01 50 2 2014-06-15 50MSFT 3 2014-06-16 NaN 3 2014-06-16 NaNTWTR 4 2014-01-17 10 4 2014-05-17 10
根据这个新的数据框,我可以按
ticker和对其进行分组
row,并每天
resample在这些组中分别应用和
fillna(使用“
pad”方法来向前填充)
In [66]: df_decomp = df_decomp.groupby(level=[0,1]).apply(lambda x: x.set_index('date').resample('D').fillna(method='pad'))In [67]: df_decomp = df_decomp.reset_index(level=1, drop=True)
最后一个命令是删除现在多余的
row索引级别。
当我们访问AAPL行时,它会提供您所需的输出:
In [69]: df_decomp.loc['AAPL']Out[69]: valdate2014-05-01 102014-06-05 202014-06-06 202014-06-07 202014-06-08 202014-06-09 202014-06-10 20
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)