gpt4 book ai didi

python - 使用带有列表与范围的 .ix 索引的意外结果

转载 作者:太空狗 更新时间:2023-10-30 00:16:50 25 4
gpt4 key购买 nike

有人可以向我解释这种行为吗?

import pandas as pd

dates = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])

df.ix['2000-01-01':'2000-01-02', ['A', 'C']]

## Output:
A C
2000-01-01 0.224944 -0.689382
2000-01-02 -0.824735 -0.805512

df.ix[['2000-01-01', '2000-01-02'], ['A', 'C']]

## Output:
A C
2000-01-01 NaN NaN
2000-01-02 NaN NaN

我原以为两个索引操作都会返回相同的(第一个)结果。

然后我有点明白了:

from datetime import datetime

df.loc[[datetime(2000, 1, 1), datetime(2000, 1, 5)], ['A','C']]

## Output
A C
2000-01-01 0.224944 -0.689382
2000-01-05 -0.393747 0.462126

现在,我不知道 pandas 的内部结构,也不知道为什么它在给定范围时将字符串隐式转换为日期,但在给定列表时却不隐式转换,但我的猜测是范围清楚地表明我们指的是具有序数的对象pandas 的性质可能会检查索引,发现它是一个日期时间,因此将字符串解析为日期。

但问题就变成了,为什么当我们提供单个字符串时它会做正确的事情?

df.loc['2000-01-01', ['A','C']]

## Output:
A 0.224944
C -0.689382
Name: 2000-01-01 00:00:00, dtype: float64

给定列表时不尝试转换多个值是否是性能问题?其他一些设计决策?

最佳答案

使用字符串访问 DatetimeIndex 有点像黑客入侵(因为 R 这样做它就在那里,但很容易找到像这样的一些边缘情况)。也就是说:

  • 它适用于切片。
  • 它适用于单一访问。
  • 它可能适用于一些其他情况,但我不会指望它。

使用时间戳比使用字符串要好得多:

In [11]: df.ix[pd.Timestamp('2000-01-01'), ['A','C']]
Out[11]:
A 0.480959
C 0.468689
Name: 2000-01-01 00:00:00, dtype: float64

In [12]: df.ix[pd.Timestamp('2000-01-01'):pd.Timestamp('2000-01-02'), ['A','C']]
Out[12]:
A C
2000-01-01 0.480959 0.468689
2000-01-02 -0.971965 -0.840954

In [13]: df.ix[[pd.Timestamp('2000-01-01'), pd.Timestamp('2000-01-02')], ['A', 'C']]
Out[13]:
A C
2000-01-01 0.480959 0.468689
2000-01-02 -0.971965 -0.840954

In [14]: df.ix[pd.to_datetime(['2000-01-01', '2000-01-02']), ['A', 'C']]
Out[14]:
A C
2000-01-01 0.480959 0.468689
2000-01-02 -0.971965 -0.840954

正如您在回答中提到的,这比 .ix 更简洁(尽管在这种情况下没有歧义)。

关于python - 使用带有列表与范围的 .ix 索引的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com