2015-10-21 57 views
0

我有兩個DataFrames,它們具有相同級別(代碼和日期)的相同多索引。第一個包含有數據的每一行(來自數據庫提取),第二個是相同的DataFrame,除了它包含所有的鍵(每個產品的每個月的水平線)。熊貓 - 可以讀取MultiIndex的列表,但不能設置它們

爲了讓更多的明確的,這裏是第一數據框(df_data):

       BL0 BL1 BL2 BL3 Shipments 
Code    Month 
ABC    2012-03-01 1000 1000 1000 1000  1000 
DEF    2014-08-01 1000 1000 1000 1000  1000 
       2014-09-01 1000 1000 1000 1000  1000 
GHI    2013-12-01 1000 1000 1000 1000  1000 
       2014-10-01 1000 1000 1000 1000  1000 
       2014-12-01 1000 1000 1000 1000  1000 

這裏是第二個(df_full),所有的一個月從2012年1至1月2015:

       BL0 BL1 BL2 BL3 Shipments 
Code    Month 
ABC    2012-01-01 NaN NaN NaN NaN  NaN 
       2012-02-01 NaN NaN NaN NaN  NaN 
       2012-03-01 1000 1000 1000 1000  1000 
       2012-04-01 NaN NaN NaN NaN  NaN 
       ... 
DEF    2014-07-01 NaN NaN NaN NaN  NaN 
       2014-08-01 1000 1000 1000 1000  1000 
       2014-09-01 1000 1000 1000 1000  1000 
       2014-10-01 NaN NaN NaN NaN  NaN 
       ... 
GHI    2013-12-01 1000 1000 1000 1000  1000 
       2014-10-01 1000 1000 1000 1000  1000 
       2014-12-01 1000 1000 1000 1000  1000    

現在,我有第一個,我試圖建立第二個。我使用MultiIndex創建了一個空的DataFrame,創建了填充NaN的每一列,並且我堅持將df_full的值設置爲它們在df_data中的值。

當我做

df_full.loc[ df_data.index, 'Shipments' ] = df_data['Shipments'] 

我得到一個錯誤,說的df_data指數是不是在df_dull

KeyError: "[('ABC', '2012-03-01') ('DEF', '2014-08-01')\n ('DEF', '2014-09-01') ..., 
('XYZ', '2014-11-01')\n ('XYZ', '2014-12-01')] not in index" 

什麼錯誤我是,如果我只是做df_full.loc[ data.index, 'Shipments' ]它返回系列沒有任何問題。我嘗試使用元組列表而不是索引,我也嘗試將切片設置爲1,但無濟於事。

我在這裏做錯了什麼?

+0

'KeyError'中的索引看起來很奇怪。那裏有一個'\ n'?或者是打印輸出的人造物? – ako

+0

另外,data.index是什麼?你只提到'df_data'和'df_full'。 – ako

+0

'data.index'是'df_data.index',我編輯了這個問題來糾正這個問題。\ n可能與這個級別的索引是字符串而不是日期時間有關,正如我在我的答案中提到的那樣。 – ursan

回答

0

經過一番挖掘,問題原來在於兩個DataFrame的索引不是同一類型。

  • df_data的指數是(字符串,字符串),並讀取CSV源文件時,大熊貓並沒有認識到,是Seconde系列的日期,我並沒有轉換成datetime。
  • df_full的索引是(字符串,pandas.Timestamp),第二項恰好與df_data格式化爲完全相同的字符串,因此我感到困惑。

當給出一個類似日期的字符串時,pandas可以理解並找到正確的行,但似乎在我試圖給它賦值時找不到它。

在將df_data的索引轉換爲(string,pandas.Timestamp)之後,所有內容都可以正常工作。

0

如果你只是想構建商品和天的所有可能的組合,你可以使用一個很好的內置可迭代,MultiIndex.from_product

commodities=['ABC','DEF','GHI','JKL'] 
days=pd.date_range(start='1/1/2012',end='1/1/2015',freq='D') 
columns = ['BL0', 'BL1','BL2', 'BL3','Shipments'] 
indx = pd.MultiIndex.from_product([commodities,days]) 
output = pd.DataFrame(index=indx,columns=columns) 
output.head() 


       BL0 BL1 BL2 BL3 Shipments 
ABC 2012-01-01 NaN NaN NaN NaN  NaN 
    2012-01-02 NaN NaN NaN NaN  NaN 
    2012-01-03 NaN NaN NaN NaN  NaN 
    2012-01-04 NaN NaN NaN NaN  NaN 
    2012-01-05 NaN NaN NaN NaN  NaN 

然後,您可以根據多指標的水平來適當地替換實際值。