2016-08-20 2 views
1

У меня есть данные и имеет преобразование с использованием dataframe панд:Изменения dataframe панды на основе одной серии

import pandas as pd 
d = [ 
    (1,70399,0.988375133622), 
    (1,33919,0.981573492596), 
    (1,62461,0.981426807114), 
    (579,1,0.983018778374), 
    (745,1,0.995580488899), 
    (834,1,0.980942505189) 
] 
df_new = pd.DataFrame(e, columns=['source_target']).sort_values(['source_target'], ascending=[True]) 

и мне нужно построить ряд для отображения столбца source и target в другую

e = [] 
for x in d: 
    e.append(x[0]) 
    e.append(x[1]) 

e = list(set(e)) 
df_new = pd.DataFrame(e, columns=['source_target']) 

df_new.source_target = (df_new.source_target.diff() != 0).cumsum() - 1 
new_ser = pd.Series(df_new.source_target.values, index=new_source_old).drop_duplicates() 

так я получаю серию :

source_target 
1  0 
579  1 
745  2 
834  3 
33919 4 
62461 5 
70399 6 
dtype: int64 

Я пробовал изменить dataframe df_beda на основе new_ser серии с помощью:

df_beda.target = df_beda.target.mask(df_beda.target.isin(new_ser), df_beda.target.map(new_ser)).astype(int) 
df_beda.source = df_beda.source.mask(df_beda.source.isin(new_ser), df_beda.source.map(new_ser)).astype(int) 

но результата:

source target weight 
0  0 70399 0.988375 
1  0 33919 0.981573 
2  0 62461 0.981427 
3  579  0 0.983019 
4  745  0 0.995580 
5  834  0 0.980943 

это неправильно, идеальный результат:

source target weight 
0  0  6 0.988375 
1  0  4 0.981573 
2  0  5 0.981427 
3  1  0 0.983019 
4  2  0 0.995580 
5  3  0 0.980943 

может быть, кто-нибудь может помочь мне показать, где моя ошибка

Thanks

ответ

2

Если заказ не имеет значения, вы можете сделать следующее. Избегайте петли for, если это абсолютно необходимо.

uniq_vals = np.unique(df_beda[['source','target']]) 
map_dict = dict(zip(uniq_vals, xrange(len(uniq_vals)))) 
df_beda[['source','target']] = df_beda[['source','target']].replace(map_dict) 

print df_beda 

    source target weight 
0  0  6 0.988375 
1  0  4 0.981573 
2  0  5 0.981427 
3  1  0 0.983019 
4  2  0 0.995580 
5  3  0 0.980943 

Если вы хотите откатить, вы можете создать обратную карту из исходной, так как он гарантированно будет отображение 1-к-1.

inverse_map = {v:k for k,v in map_dict.iteritems()} 
df_beda[['source','target']] = df_beda[['source','target']].replace(inverse_map) 
print df_beda 

    source target weight 
0  1 70399 0.988375 
1  1 33919 0.981573 
2  1 62461 0.981427 
3  579  1 0.983019 
4  745  1 0.995580 
5  834  1 0.980943 
+0

я есть обновить мой вопрос ... ТНХ :) – ihsansat

+0

WAW .... это Скоростной работа ... ТНХ :) – ihsansat

+0

Привет @ Happy001, он не использует серии права? если я хочу вернуться из вашего результата в исходное значение, как это сделать? – ihsansat

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