0

以下行为是预期的还是错误?

我有一个过程,我需要来自 Dataframe 的行,但在边界条件中,简单的规则(所有行前 5 天将部分或完全在索引之外生成选择。我希望熊猫表现得像 python 并始终返回一个框架,即使有时没有行。

索引为周期索引,数据已排序。

配置是 panas 12 numpy 1.7 和 windows 64

在测试中,如果请求的切片不完全符合索引,则 df.loc 会引发索引错误

df[start:end] 返回了一个框架,但并不总是我期望的行

import pandas as pd
october =  pd.PeriodIndex( start = '20131001', end = '20131010', freq = 'D')
oct_sales =pd.DataFrame(dict(units=[100+ i for i in range(10)]), index =october)

#returns empty frame as desired
oct_sales['2013-09-01': '2013-09-30']

# empty dataframe -- I was expecting two rows
oct_sales['2013-09-30': '2013-10-02']

# works as expected
oct_sales['2013-10-01': '2013-10-02']

# same as oct_sales['2013-10-02':]  -- expected no rows
oct_sales['2013-10-02': '2013-09-30']
4

1 回答 1

1

这正如预期的那样。标签上的切片(开始:结束)仅在标签存在时才有效。要在整个期间重新索引后获得我认为的内容,请选择,然后 dropna。也就是说,提升的loc行为是正确的,而[]索引应该可以工作(可能是一个错误)。

In [23]: idx =  pd.PeriodIndex( start = '20130901', end = '20131010', freq = 'D')

In [24]: oct_sales.reindex(idx)
Out[24]: 
            units
2013-09-01    NaN
2013-09-02    NaN
2013-09-03    NaN
2013-09-04    NaN
2013-09-05    NaN
2013-09-06    NaN
2013-09-07    NaN
2013-09-08    NaN
2013-09-09    NaN
2013-09-10    NaN
2013-09-11    NaN
2013-09-12    NaN
2013-09-13    NaN
2013-09-14    NaN
2013-09-15    NaN
2013-09-16    NaN
2013-09-17    NaN
2013-09-18    NaN
2013-09-19    NaN
2013-09-20    NaN
2013-09-21    NaN
2013-09-22    NaN
2013-09-23    NaN
2013-09-24    NaN
2013-09-25    NaN
2013-09-26    NaN
2013-09-27    NaN
2013-09-28    NaN
2013-09-29    NaN
2013-09-30    NaN
2013-10-01    100
2013-10-02    101
2013-10-03    102
2013-10-04    103
2013-10-05    104
2013-10-06    105
2013-10-07    106
2013-10-08    107
2013-10-09    108
2013-10-10    109

In [25]: oct_sales.reindex(idx)['2013-09-30':'2013-10-02']
Out[25]: 
            units
2013-09-30    NaN
2013-10-01    100
2013-10-02    101

In [26]: oct_sales.reindex(idx)['2013-09-30':'2013-10-02'].dropna()
Out[26]: 
            units
2013-10-01    100
2013-10-02    101
于 2013-11-01T16:36:27.263 回答