因此,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
答案 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
如果您希望标量索引操作返回与切片相同的内容,请使用iloc
或iat
(奇异值):
df['col1'].sort_values().iloc[0]
# 1
df['col1'].sort_values().iat[0]
# 1