2016-04-06 36 views
0

我正在使用patsy來創建矩陣。但是當數據集中有None或者Nan值時,我會產生奇怪的行爲。如下所示,而不是僅刪除None行,它會創建具有1和0的其他列。當我添加一個None值時,爲什麼patsy會返回其他列?

import numpy as np 
import pandas as pd 
import patsy as pt 

df = pd.DataFrame(np.array([(1,3),(2,6),(4,2),(6,3)]), columns=['y','X']) 
In[60]: df 
Out[60]: 
    y X 
0 1 3 
1 2 6 
2 4 2 
3 6 3 
In[61]: pt.dmatrices('y ~ X', df) 
Out[61]: 
(DesignMatrix with shape (4, 1) 
    y 
    1 
    2 
    4 
    6 
    Terms: 
    'y' (column 0), 
DesignMatrix with shape (4, 2) 
    Intercept X 
      1 3 
      1 6 
      1 2 
      1 3 
    Terms: 
    'Intercept' (column 0) 
    'X' (column 1)) 
In[62]: df = pd.DataFrame(np.array([(1,3),(2,6),(4,2),(6,None)]), columns=['y','X']) 
In[63]: pt.dmatrices('y ~ X', df) 
Out[63]: 
(DesignMatrix with shape (3, 4) 
    y[1] y[2] y[4] y[6] 
     1  0  0  0 
     0  1  0  0 
     0  0  1  0 
    Terms: 
    'y' (columns 0:4), 
DesignMatrix with shape (3, 3) 
    Intercept X[T.3] X[T.6] 
      1  1  0 
      1  0  1 
      1  0  0 
    Terms: 
    'Intercept' (column 0) 
    'X' (columns 1:3)) 

爲什麼patsy在添加None值時返回附加列?

回答

1

如果我理解正確,numpy數組不會將None視爲nan,所以熊貓數據框將該列作爲object。由於它不是一個數字列,所以patsy試圖爲分類變量創建一個矩陣。

您可以跳過np.array與構建矩陣:

df = pd.DataFrame([(1,3),(2,6),(4,2),(6,None)], columns=['y','X']) 

或者你也可以通過np.nan而不是無:

df = pd.DataFrame(np.array([(1,3),(2,6),(4,2),(6,np.nan)]), columns=['y','X']) 

結果將是:

(DesignMatrix with shape (3L, 1L) 
    y 
    1 
    2 
    4 
    Terms: 
    'y' (column 0), 
DesignMatrix with shape (3L, 2L) 
    Intercept X 
      1 3 
      1 6 
      1 2 
    Terms: 
    'Intercept' (column 0) 
    'X' (column 1)) 
012f
+0

謝謝,我想第二個答案應該是:df = pd.DataFrame(np.array([(1,3),(2,6),(4,2),(6,np.nan)])) ,列= [ 'y','X'])引發NameError:name'nan'沒有被定義 – user1181337

+0

你說得對,Canopy會自動導入它們,所以我有時忘記包含np。現在編輯。 – ayhan

相關問題