2016-04-15 2 views
4

У меня есть dataframe 'ДФ', как это -Сохраняя значения NaN после get_dummies в панд

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

Если я использую

df1 = get_dummies(df) 
df1 

Я получаю

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

Как я могу получить эффективно?

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

Я использовал это на начальном этапе, но это занимает слишком много времени

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 

Я использую Python 3.5.1 на Jupyter и панды 0,18. Благодарю.

ответ

6

Метод # 1 будет использовать пренебрежимо малых v1 «s непосредственно, без петель:

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

Метод # 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 
+0

Спасибо, метод 1 работает для меня. Любые подсказки, как я мог бы расширить его для аналогичного фреймворка данных со многими столбцами, например, v1? –

Смежные вопросы