我几天前刚开始使用熊猫,而且我也不是Python的习惯用户。我在下面显示的示例中发现loc
的以下行为令人困惑:
import pandas as pd
dates = pd.date_range('2015-01-01', '2015-01-07')
df = pd.DataFrame({'Sunnyland':[34, 36, 32, 37, 34, 36, 38], 'Freezeville':[4, 5, 6, 5, 5, 3, 2]}, index=dates)
创建日期框架:
[请原谅列名称的格式问题,它们应该与表格列对齐]:
Freezeville Sunnyland 2015-01-01 4 34 2015-01-02 5 36 2015-01-03 6 32 2015-01-04 5 37 2015-01-05 5 34 2015-01-06 3 36 2015-01-07 2 38
现在让我们使用loc
来选择行:
df.loc['2015-01-02'] # select single row
这可以按预期工作,输出Series
对象:
Freezeville 5 Sunnyland 36 Name: 2015-01-02 00:00:00, dtype: int64
以下工作也很好
df.loc['2015-01-02':'2015-01-06'] # select range of rows:
对外输出:
Freezeville Sunnyland 2015-01-02 5 36 2015-01-03 6 32 2015-01-04 5 37 2015-01-05 5 34 2015-01-06 3 36
问题在于以下声明:
df.loc[['2015-01-02', '2015-01-06']] # comma-separated list of rows
产生
Freezeville Sunnyland 2015-01-02 NaN NaN 2015-01-06 NaN NaN
我会认为这里出现了某种类型的推理问题 - 除非在这种情况下我会期待KeyError
或其他东西,而不是看到的结果。
那么解释是什么?如何按日期选择多个(任意)行?
答案 0 :(得分:3)
我不知道解释,也许目前的实现很难概括为列出索引。如果您使用实际时间戳而不是字符串,它将起作用:
In [31]: df.loc[pd.DatetimeIndex(['2015-01-02', '2015-01-06'])]
Out[31]:
Freezeville Sunnyland
2015-01-02 5 36
2015-01-06 3 36
答案 1 :(得分:1)
我认为您需要按http://www.w3schools.com/cssref/sel_enabled.asp将字符串转换为datetime
并获取to_datetime
,因为您需要匹配索引:
print pd.to_datetime('2015-01-02')
2015-01-02 00:00:00
print pd.to_datetime('2015-01-02').date()
2015-01-02
print df.loc[[pd.to_datetime('2015-01-02').date(), pd.to_datetime('2015-01-06').date()]]
Freezeville Sunnyland
2015-01-02 5 36
2015-01-06 3 36