2016-04-15 15 views
4

Ich habe einen Datenrahmen 'df' so -Halte NaN-Werte nach get_dummies in Pandas

Id v1 v2 
0  A  0.23 
1  B  0.65 
2  NaN 0.87 

Wenn ich

df1 = get_dummies(df) 
df1 

verwende ich

Id v1_A v1_B v2 
0  1  0  0.23 
1  0  1  0.65 
2  0  0  0.87 . 

bekommen Wie kann ich das Folgende effizient?

Id v1_A v1_B v2 
0  1  0  0.23 
1  0  1  0.65 
2  NaN  NaN  0.87 . 

Ich war mit diesem zunächst, aber es dauert zu lange

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 

Ich bin mit Python 3.5.1 auf Jupyter und Pandas 0,18. Vielen Dank.

Antwort

6

Methode # 1 wäre, ohne Schleifen direkt v1 ‚s Nans zu verwenden:

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

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

Methode # 2 würde das dummy_na Argument zu nutzen, um uns eine Spalte bekommen wir nutzen können

+0

Danke, Methode 1 funktioniert für mich. Irgendwelche Hinweise, wie ich es für einen ähnlichen Datenrahmen mit vielen Spalten wie v1 erweitern könnte? –