当我添加None值时,为什么patsy会返回其他列?

时间:2016-04-06 04:40:03

标签: numpy pandas patsy

我使用patsy创建矩阵。但是当数据集中包含None或Nan值时,我会遇到奇怪的行为。如下所示,它不是仅删除None行,而是创建包含1&0和0的其他列。

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))

为什么在添加None值时patsy会返回其他列?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,numpy数组不会将None视为nan,因此pandas数据框会将该列视为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))