gpt4 book ai didi

python - 在多索引上使用切片器

转载 作者:太空狗 更新时间:2023-10-30 01:06:19 25 4
gpt4 key购买 nike

我有以下形式的数据框:

Contract  Date      
201501 2014-04-29 1416.0
2014-04-30 1431.1
2014-05-01 1430.6
2014-05-02 1443.9
2014-05-05 1451.6
2014-05-06 1461.4
2014-05-07 1456.0
2014-05-08 1441.1
2014-05-09 1437.8
2014-05-12 1445.2
2014-05-13 1458.2
2014-05-14 1487.6
2014-05-15 1477.6
2014-05-16 1467.9
2014-05-19 1484.9
2014-05-20 1470.5
2014-05-21 1476.9
2014-05-22 1490.0
2014-05-23 1473.3
2014-05-27 1462.5
2014-05-28 1456.3
2014-05-29 1460.5
201507 2014-05-30 1463.5
2014-06-02 1447.5
2014-06-03 1444.4
2014-06-04 1444.7
2014-06-05 1455.9
2014-06-06 1464.0

其中 Contract 和 Date 分别是 intdatetime64 类型的索引。

我想要的是选择一个日期范围。它的工作原理是:

df.reset_index('Contract', drop=True).loc['2014-09']

但我讨厌这个,因为它丢失了索引/不是很愉快(我必须做很多这样的事情)。

我想我应该可以这样做:

df.loc[:,'2014-09']

以恢复 2014 年 9 月的所有数据。实际上,这是行不通的。我只能通过以下方式选择一天:

df.loc[:,'2014-09-02']

为什么我的多索引切片器不起作用?

最佳答案

Pandas 需要您明确选择层次索引的列还是子级别。在这种情况下,df.loc[:,'2014-09'] 失败,因为 pandas 试图获取所有行,然后查找标记为 '2014-09' 的列(不存在)。

相反,您需要为多索引的两个级别提供列标签/切片。

要从您的示例中选择 2014 年 5 月的所有数据,您可以编写:

>>> df.loc[(slice(None), '2014-05'), :]                            
Contract Date
201501 2014-05-01 1430.6
2014-05-02 1443.9
2014-05-05 1451.6
2014-05-06 1461.4
2014-05-07 1456.0
2014-05-08 1441.1
2014-05-09 1437.8
2014-05-12 1445.2
2014-05-13 1458.2
2014-05-14 1487.6
2014-05-15 1477.6
2014-05-16 1467.9
2014-05-19 1484.9
2014-05-20 1470.5
2014-05-21 1476.9
2014-05-22 1490.0
2014-05-23 1473.3
2014-05-27 1462.5
2014-05-28 1456.3
2014-05-29 1460.5
201507 2014-05-30 1463.5

此处 [(slice(None), '2014-05'), :] 转换为 [:, '2014-05'] 的切片行和列的 [:]

pd.IndexSlice 对象的引入是为了让这些切片语义更容易一些:

>>> idx = pd.IndexSlice
>>> df.loc[idx[:, '2014-05'], :]
# same slice of DataFrame

关于python - 在多索引上使用切片器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38294332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com