我有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中却没有呢?
答案 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
,因为这样可以更全面地实现一致性。