有人可以向我解释这种行为吗?
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可能会检查索引,看到它是一个日期时间,因此将字符串解析为日期。
但问题变成了,为什么当我们提供单个字符串时它会做正确的事情?
df.loc['2000-01-01', ['A','C']]
## Output:
A 0.224944
C -0.689382
Name: 2000-01-01 00:00:00, dtype: float64
在给定列表时,是否存在不尝试转换多个值的性能问题?其他一些设计决定?
答案 0 :(得分:1)
使用字符串访问DatetimeIndex是一种被黑客入侵(因为R在那里做到了这一点,但很容易找到像这样的边缘情况)。也就是说:
使用Timestamps而不是字符串要好得多:
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
正如你的回答所提到的那样,.loc
而不是.ix
更清晰(虽然在这种情况下没有歧义)。