熊猫数据帧上的切片行为[:]不一致

时间:2019-03-19 06:53:19

标签: python pandas

我有2个数据帧。第一个数据帧具有数字作为索引。第二个数据帧具有日期时间作为索引。切片运算符(:)在这些数据帧上的行为有所不同。

案例1

>>> df = pd.DataFrame({'A':[1,2,3]}, index=[0,1,2])
>>> df
   A
0  1
1  2
2  3
>>> df [0:2]
   A
0  1
1  2

案例2

>>> a = dt.datetime(2000,1,1)
>>> b = dt.datetime(2000,1,2)
>>> c = dt.datetime(2000,1,3)
>>> df = pd.DataFrame({'A':[1,2,3]}, index = [a,b,c])
>>> df
            A
2000-01-01  1
2000-01-02  2
2000-01-03  3
>>> df[a:b]
            A
2000-01-01  1
2000-01-02  2

为什么在情况1中排除了最后一行,而在情况2中却没有呢?

2 个答案:

答案 0 :(得分:5)

不要使用它,最好使用loc以获得一致性:

df = pd.DataFrame({'A':[1,2,3]}, index=[0,1,2])

print (df.loc[0:2])
   A
0  1
1  2
2  3

a = datetime.datetime(2000,1,1)
b = datetime.datetime(2000,1,2)
c = datetime.datetime(2000,1,3)
df = pd.DataFrame({'A':[1,2,3]}, index = [a,b,c])

print (df.loc[a:b])
            A
2000-01-01  1
2000-01-02  2

原因,为何在docs中找到省略最后一行的原因:

  

使用DataFrame,在[]内切片将对行进行切片。由于这是一种常见的操作,因此在很大程度上是为了方便起见。

print (df[0:2])
   A
0  1
1  2

使用exact indexing作为日期时间选择:

  

...相反,使用Timestamp或datetime对象建立索引是准确的,因为这些对象具有确切的含义。这些还遵循包括两个端点的语义

答案 1 :(得分:1)

首先要了解这一点,让我们进行实验

import pandas as pd
import datetime as dt
a = dt.datetime(2000,1,1)
b = dt.datetime(2000,1,2)
c = dt.datetime(2000,1,3)
df = pd.DataFrame({'A':[4,5,6]}, index=[a,b,c])

现在让我们使用

df2[0:2]

哪个给了我们

            A
2000-01-01  1
2000-01-02  2

现在,这种行为通过python和列表切片是一致的,但是如果您使用 df[a:c]

你得到

    A
2000-01-01  1
2000-01-02  2
2000-01-03  3

这是因为df[a:c]会覆盖默认的列表切片方法,因为索引不对应于整数,并且在以Pandas编写的函数中(它也包含最后一个元素),因此,如果索引是整数,则pandas默认为内置切片,但是如果它们不是整数,则可以观察到这种效果,正如jezrael的答案中已经提到的那样,最好使用loc,因为这样可以更全面地实现一致性。