为什么series [0]和series [0:1]会产生不同的结果?

时间:2019-10-26 20:10:38

标签: python pandas

因此,df['date']返回:

0        2018-03-01
1        2018-03-01
2        2018-03-01
3        2018-03-01
4        2018-03-01
            ...    
469796   2018-06-20
469797   2018-06-20
469798   2018-06-27
469799   2018-06-27
469800   2018-12-06
Name: date, Length: 469801, dtype: datetime64[ns]

然后df['date'].sort_values()返回:

137241   2018-01-01
378320   2018-01-01
247339   2018-01-01
34333    2018-01-01
387971   2018-01-01
            ...    
109278   2018-12-06
384324   2018-12-06
384325   2018-12-06
109282   2018-12-06
469800   2018-12-06
Name: date, Length: 469801, dtype: datetime64[ns]

现在df['date'].sort_values()[0]“忽略排序”并返回:

Timestamp('2018-03-01 00:00:00')

df['date'].sort_values()[0:1]实际上返回:

137241   2018-01-01
Name: date, dtype: datetime64[ns]

为什么显然的行为不一致?正如@ cs95准确指出的那样,它们分别返回一个标量和一个Series,这没关系。我对值感到困惑,第一个是2018-03-01,第二个是2018-01-01

谢谢。


警告

某种程度上类似于:why sort_values() is diifferent form sort_values().values

1 个答案:

答案 0 :(得分:1)

对于标量索引与切片的Pandas索引的解释方式略有不同。考虑一个更简单的示例:

df = pd.DataFrame({'col1': [5, 4, 3, 2, 1]}).sample(frac=1)
df
   col1
4     1
1     4
0     5
3     2
2     3

还要注意sort_values的结果:

df['col1'].sort_values()
4    1
3    2
2    3
1    4
0    5

当您调用df['col1'].sort_values()[0]时,您实际上会获得通过键0索引的值。在这里,它隐式调用loc

df['col1'].sort_values()[0]     # just gets the value indexed by that key
# 5

df['col1'].sort_values().loc[0]
# 5

当您对索引切片时,假定它们是整数而不是标签,这意味着它隐式调用iloc

df['col1'].sort_values()[0:1]   # just gets the first row  
4    1
Name: col1, dtype: int64


df['col1'].sort_values().iloc[0:1]
4    1
Name: col1, dtype: int64

如果您希望标量索引操作返回与切片相同的内容,请使用ilociat(奇异值):

df['col1'].sort_values().iloc[0]
# 1

df['col1'].sort_values().iat[0]
# 1