2017-10-11 95 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

哦,這是一個驚喜。那麼我現在更喜歡你的解決方案。你知道他們棄用它的原因嗎? –

相關問題