2017-10-11 191 views
2

我很好奇为什么我可以给切片赋值,但不能直接打印出来。以下代码显示细节:熊猫DataFrame日期时间索引切片错误

import pandas as pd 
import numpy as np 
from datetime import datetime 

dt_start = datetime.strptime("20171010", "%Y%m%d") 
dt_end = datetime.strptime("20171020", "%Y%m%d") 

df = pd.DataFrame(np.nan, index=pd.date_range(start=dt_start, end=dt_end), columns=['sales', 'account']) 

df.loc[:1, 'sales'] = 100 # works well 
print(df.loc[:1, 'sales']) # error, why??? 

错误消息:
类型错误:不能做切片索引阶级“pandas.tseries.index.DatetimeIndex这些索引类[1]‘诠释’

为什么我可以赋值但不能打印此片?

非常感谢您的检查。

+0

它看起来像臭虫。 – jezrael

回答

1

我觉得首先看起来像错误:

df.loc[:1, 'sales'] = 100 

我觉得更好的是使用iloc如果需要的位置seelct - 但需要get_locsales柱的位置太:

df.iloc[:1, df.columns.get_loc('sales')] = 100 
print (df) 
      sales account 
2017-10-10 100.0  NaN 
2017-10-11 NaN  NaN 
2017-10-12 NaN  NaN 
2017-10-13 NaN  NaN 
2017-10-14 NaN  NaN 
2017-10-15 NaN  NaN 
2017-10-16 NaN  NaN 
2017-10-17 NaN  NaN 
2017-10-18 NaN  NaN 
2017-10-19 NaN  NaN 
2017-10-20 NaN  NaN 

print (df.iloc[:1, df.columns.get_loc('sales')]) 
2017-10-10 NaN 
Freq: D, Name: sales, dtype: float64 

print (df.columns.get_loc('sales')) 
0 
+0

谢谢Jezrael。你的评论给了我一个火花,是的,也许这是一个错误。我也学到了你的解决方案,是的,那很好。我现在有另一个解决方案,使用ix。 df.ix [:1,'sales'] = 100,我们可以打印df.ix [:1,'sales']。因为ix可以使用索引,行/列序列和名称组合。 –

+0

是的,'ix'帮助,但在最新版本是[弃用](http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated)。 – jezrael

+0

哦,这是一个惊喜。那么我现在更喜欢你的解决方案。你知道他们弃用它的原因吗? –

相关问题