2016-03-25 7 views
2

sich das folgende pandas Datenrahmen (df):Pandas Datenrahmen: Zuordnung von Werten gemäß Rängen auf Zeilenebene

index A  B  C  D  E  F  G  weights 

1  NaN 1  NaN NaN NaN 3  2  [0.6 , 0.2 , 0.2] 
2  3  2  NaN 1  NaN NaN NaN [0.5 , 0.4 , 0.1] 
3  NaN NaN 1  2  3  NaN NaN [0.8 , 0.1 , 0.1] 
4  NaN 3  1  NaN NaN 2  NaN [0.9 , 0.1 , 0.0] 

gewünschten Ausgang (Werte abgestimmt, um ihre entsprechenden Gewichte auf Zeilenebene):

1  NaN 0.6 NaN NaN NaN 0.2 0.2 
2  0.1 0.4 NaN 0.5 NaN NaN NaN 
3  NaN NaN 0.8 0.1 0.1 NaN NaN 
4  NaN 0.0 0.9 NaN NaN 0.1 NaN 

Meine aktuelle Lösung:

def assign_weights(row): 
    for i in range(1,4): 
     row.replace(i, row.weights[i-1], inplace=True) 
    return row 

df.apply(assign_weights, axis = 1) 

gibt es einen schnelleren Weg (für einen großen Datenrahmen mit mehr Gewichtungen zugewiesen werden)?

Antwort

1

nicht sicher, ob dies wird schneller sein, aber:

>>> def worker(row): 
...  n = np.array(row['weights']) 
...  i = (row.notnull()) & (row.index != 'weights') 
...  row[i] = n[row[i].astype('int').values - 1] 
...  return row 
>>> 
>>> df.apply(worker, axis=1) 
     A B C D E F G   weights 
index              
1  NaN 0.6 NaN NaN NaN 0.2 0.2 [0.6, 0.2, 0.2] 
2  0.1 0.4 NaN 0.5 NaN NaN NaN [0.5, 0.4, 0.1] 
3  NaN NaN 0.8 0.1 0.1 NaN NaN [0.8, 0.1, 0.1] 
4  NaN 0.0 0.9 NaN NaN 0.1 NaN [0.9, 0.1, 0.0] 
+0

gute Wahl. Das ergibt eine Laufzeitverbesserung von 15-20% für mich. –

Verwandte Themen