在Pandas中的get_dummies之后保留NaN值

Gau*_*are 7 python-3.x pandas

我有一个像这样的数据帧'df' -

Id    v1    v2
0     A     0.23
1     B     0.65
2     NaN   0.87
Run Code Online (Sandbox Code Playgroud)

如果我使用

df1 = get_dummies(df)
df1
Run Code Online (Sandbox Code Playgroud)

我明白了

Id    v1_A    v1_B    v2
0     1       0       0.23
1     0       1       0.65
2     0       0       0.87 .
Run Code Online (Sandbox Code Playgroud)

如何有效地获得以下内容?

Id    v1_A    v1_B    v2
0     1       0       0.23
1     0       1       0.65
2     NaN     NaN     0.87 .
Run Code Online (Sandbox Code Playgroud)

我最初使用它,但它需要太长时间

import numpy as np    
dfv1 = df[[v1]]    #Slicing the v1 column
dfs = get_dummies(dfv1)    
dfsum = dfs.apply(np.sum, axis=1)    #Calculating row by row sum of dfs
for i in range(dfs.size):    #Iterating over the entire dataframe
    if dfsum.iloc[i]==0:     #and if the sum is zero for some 'i'
        dfs.iloc[i][:]==np.nan    #changing corresponding row to NaN
del df['v1']    #Deleting original column
df = pandas.concat([df, dfs], axis=1)    #Appending the new one
Run Code Online (Sandbox Code Playgroud)

我在Jupyter和Pandas 0.18上使用Python 3.5.1.谢谢.

DSM*_*DSM 10

方法#1将v1直接使用'sans,没有循环:

>>> df1 = pd.get_dummies(df)
>>> df1.loc[df.v1.isnull(), df1.columns.str.startswith("v1_")] = np.nan
>>> df1
   Id    v2  v1_A  v1_B
0   0  0.23   1.0   0.0
1   1  0.65   0.0   1.0
2   2  0.87   NaN   NaN
Run Code Online (Sandbox Code Playgroud)

方法#2将使用dummy_na参数来获取我们可以使用的列:

>>> df1 = pd.get_dummies(df, dummy_na=True)
>>> df1
   Id    v2  v1_A  v1_B  v1_nan
0   0  0.23   1.0   0.0     0.0
1   1  0.65   0.0   1.0     0.0
2   2  0.87   0.0   0.0     1.0
>>> df1.loc[df1.v1_nan == 1, ["v1_A", "v1_B"]] = np.nan
>>> del df1["v1_nan"]
>>> df1
   Id    v2  v1_A  v1_B
0   0  0.23   1.0   0.0
1   1  0.65   0.0   1.0
2   2  0.87   NaN   NaN
Run Code Online (Sandbox Code Playgroud)