【问题标题】:Why does series[0] and series[0:1] yield different results?为什么 series[0] 和 series[0:1] 会产生不同的结果?
【发布时间】:2019-10-27 04:49:33
【问题描述】:

所以,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 准确指出的那样,它们分别返回一个标量和一个系列,这没关系。我对值感到困惑,第一个是2018-03-01,而第二个是2018-01-01

提前致谢。


警告

有点类似于:why sort_values() is diifferent form sort_values().values

【问题讨论】:

  • 在我设置示例之前,df['date'].sort_values().iloc[0:1, :]。这样做是否符合预期?
  • 呃...不,错误:Too many indexers
  • df['date'].sort_values()[0] 返回一个标量,df['date'].sort_values()[0:1] 返回一个系列。你必须先了解 python 的列表切片符号是如何工作的。
  • @cs95 感谢您抽出宝贵时间回复,但我仍然看不出您的评论有什么帮助。或许你可以详细说明一下?
  • 这是 pandas 的奇怪之处之一。 df['date'].sort_values()[0] 实际上对系列进行了排序,但是您不要求在第一个位置 (0) 的项目,而是要求“标记”为 0 的项目 - 原始系列中的第一个项目。您可以将其替换为df['date'].sort_values().iloc[0]

标签: python pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多