0

我正在使用 patsy 创建矩阵。但是当数据集中有 None 或 Nan 值时,我会出现奇怪的行为。如下所示,它不只是删除 None 行,而是创建带有 1 和 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 会返回其他列?

4

1 回答 1

1

如果我理解正确,numpy 数组不会被视为Nonenan因此 pandas 数据框将该列视为object. 由于它不是数字列,因此 patsy 正在尝试为分类变量制作矩阵。

您可以跳过 np.array 并使用以下方法构造矩阵:

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

或者你可以直接通过np.nan而不是 None:

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))
于 2016-04-06T07:19:25.317 回答