>假设我有一个数据帧,它的子索引结构如下所示,带有"日期","男高音","垫子"和"罢工",并且要观察的字段存储在"vol"列中:
date tenor mat strike vol
20120903 3m 1y 0.25 52.
0.50 51.
1.00 49.
20120903 3m 5y 0.25 32.
0.50 55.
1.00 23.
20120903 3m 10y 0.25 65.
0.50 55.
1.00 19.
20120904 3m 1y 0.25 32.
0.50 57.
1.00 44.
20120904 3m 5y 0.25 54.
0.50 50.
1.00 69.
20120904 3m 10y 0.25 42.
0.50 81.
1.00 99.
假设我想通过获取一个新的数据帧来重新组织这些数据,该数据帧的子索引为"date"+"tenor",并且"值"由原始数据帧中的"mat"、"strike"和"vol"组成的 3d 数组给出
,如下所示:date tenor values
20120903 3m [[1y,5y,10y],[0.25, 0.50, 1.00], [52., 51., 49.],
[32., 55., 23.],
[65., 55., 19.]]
20120904 3m [[1y,5y,10y],[0.25, 0.50, 1.00], [32., 57., 44.],
[54., 50., 69.],
[42., 81., 99.]]
我尝试了各种"解栈"、"分组"和"枢轴"尝试,但没有成功。我只能通过使用大量的python矢量操作来达到我的目标,但这是一个缓慢而低效的过程。是否有任何特定的,更有效的熊猫程序来获得相同的结果?我对此感到迷茫...感谢您的帮助,毛里齐奥
像这样的事情怎么样:
In [111]: df
Out[111]:
mat strike vol
date tenor
20120903 3m 1y 0.25 52
3m 1y 0.50 51
3m 1y 1.00 49
3m 5y 0.25 32
3m 5y 0.50 55
3m 5y 1.00 23
3m 10y 0.25 65
3m 10y 0.50 55
3m 10y 1.00 19
20120904 3m 1y 0.25 32
3m 1y 0.50 57
3m 1y 1.00 44
3m 5y 0.25 54
3m 5y 0.50 50
3m 5y 1.00 69
3m 10y 0.25 42
3m 10y 0.50 81
3m 10y 1.00 99
In [112]: def agg_func(x):
mats = list(x.mat.unique())
strikes = list(x.strike.unique())
vols = x.pivot('mat', 'strike', 'vol').reindex(mats, columns=strikes)
return [mats, strikes, vols.values.tolist()]
.....:
In [113]: rs = df.groupby(level=['date', 'tenor']).apply(agg_func)
In [114]: rs
Out[114]:
date tenor
20120903 3m [['1y', '5y', '10y'], [0.25, 0.5, 1.0], [[52.0...
20120904 3m [['1y', '5y', '10y'], [0.25, 0.5, 1.0], [[32.0...
In [115]: rs.values[0]
Out[115]:
[['1y', '5y', '10y'],
[0.25, 0.5, 1.0],
[[52.0, 51.0, 49.0], [32.0, 55.0, 23.0], [65.0, 55.0, 19.0]]]