【发布时间】:2017-06-13 21:59:39
【问题描述】:
我有一个DataFrame 和一个MultiIndex。索引字段为OptionSymbol(0 级)和QuoteDatetime(1 级)。我已经对DataFrame 进行了索引和排序,如下所示:
sorted = df.sort_values(
['OptionSymbol', 'QuoteDatetime'],
ascending=[False, True]
)
indexed = sorted.set_index(
['OptionSymbol', 'QuoteDatetime'],
drop=True
)
这会导致以下结果:
Id Strike Expiration OptionType
OptionSymbol QuoteDatetime
ZBYMZ 2013-09-02 234669 170.0 2011-01-22 put
2013-09-03 234901 170.0 2011-01-22 put
2013-09-04 235133 170.0 2011-01-22 put
... ... ... ... ... ...
YBWNA 2010-02-12 262202 95.0 2010-02-20 call
2010-02-16 262454 95.0 2010-02-20 call
2010-02-17 262707 95.0 2010-02-20 call
... ... ... ... ... ...
XWNAX 2012-07-12 262201 90.0 2010-02-20 call
2012-07-16 262453 90.0 2010-02-20 call
2012-07-17 262706 90.0 2010-02-20 call
... ... ... ... ... ...
WWWAX 2012-04-12 262201 90.0 2010-02-20 call
2012-04-16 262453 90.0 2010-02-20 call
2012-04-17 262706 90.0 2010-02-20 call
... ... ... ... ... ...
正如预期的那样,框架首先按OptionSymbol 的降序和升序在OptionSymbol 组中排序。
我需要做的是现在使用QuoteDatetime 中的第一个值,所以结果如下所示:
Id Strike Expiration OptionType
OptionSymbol QuoteDatetime
XBWNA 2010-02-12 262202 95.0 2010-02-20 call
2010-02-16 262454 95.0 2010-02-20 call
2010-02-17 262707 95.0 2010-02-20 call
... ... ... ... ... ...
NWWAX 2012-04-12 262201 90.0 2010-02-20 call
2012-04-16 262453 90.0 2010-02-20 call
2012-04-17 262706 90.0 2010-02-20 call
... ... ... ... ... ...
BWNAX 2012-07-12 262201 90.0 2010-02-20 call
2012-07-16 262453 90.0 2010-02-20 call
2012-07-17 262706 90.0 2010-02-20 call
... ... ... ... ... ...
XBYMZ 2013-09-02 234669 170.0 2011-01-22 put
2013-09-03 234901 170.0 2011-01-22 put
2013-09-04 235133 170.0 2011-01-22 put
... ... ... ... ... ...
我已经尝试了各种通过 index=1 进行求助的方法,但后来我失去了OptionSymbol 组。我该怎么做?
使用代码编辑以重新创建
from collections import OrderedDict
df = OrderedDict((
('OptionSymbol', pd.Series(['ZBYMZ', 'ZBYMZ', 'ZBYMZ', 'YBWNA', 'YBWNA', 'YBWNA', 'XWNAX', 'XWNAX', 'XWNAX', 'WWWAX', 'WWWAX', 'WWWAX', ])),
('QuoteDatetime', pd.Series(['2013-09-02', '2013-09-03', '2013-09-04', '2010-02-12', '2010-02-16', '2010-02-17', '2012-07-12', '2012-07-16', '2012-07-17', '2012-04-12', '2012-04-16', '2012-04-17'])),
('Id', pd.Series(np.random.randn(12,))),
('Strike', pd.Series(np.random.randn(12,))),
('Expiration', pd.Series(np.random.randn(12,))),
('OptionType', pd.Series(np.random.randn(12,)))
))
在这种情况下使用df.sort_index(level=1) 很奇怪,但是在我的完整数据集(20 多列)上,我丢失了OptionSymbol 分组。
【问题讨论】:
-
最好以易于复制和粘贴的格式提供示例数据。从我自己的角度来看,我不想浪费时间输入您拥有的数据或做任何其他事情来复制您的数据。我的 2 美分。
-
好点。这来自一个不容易复制的数据库。
-
@JasonStrimpel,您能否提供可重现数据集(输入和所需数据集)?目前还不是很清楚...
-
使用重新创建的代码进行编辑,尽管@MaxU 的简单答案似乎在原始数据 (100_000_000 x 20) 中有效,但我失去了 OptionSymbol 分组。
-
天啊,我发现数据库出现数据问题。
OptionSymbol实际上改变了格式,这打破了第一类。 @MaxU 是对的
标签: python sorting pandas dataframe multi-index