我使用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会返回其他列?
答案 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))