2016-05-02 4 views
1

Wie bekomme ich die gleichen Ergebnisse wie der folgende Code ohne Verwendung von for-Schleife: meine typischen Daten hat ~ 500k Reihen, und wie es ist, ist der Code zu zeitaufwendig.Aktualisierungszelle Wert von Duplikaten ohne Verwendung von für Schleife

data={'key1':[1,2,1,1,2,3,2,2],'key2':[2,2,2,2,2,4,2,2],'class':[5,10,'NaN','NaN','NaN',6,'NaN','NaN']} 
frame = pd.DataFrame(data,columns=['key1','key2','class']) 

Diese Datenrahmen enthält einige [key1,key2] Duplikate, wie: [1,2] und [2,2]. Das erste Vorkommen des Duplikats hat einen endlichen Wert von 'class', während den anderen Duplikaten der Wert 'NaN' class zugewiesen wird. Der folgende Code nimmt den 'class' Wert des ersten Vorkommens und weist es den Duplikaten der gleichen Gruppe zu.

for name, group in frame.groupby(['key1', 'key2']): 
    listOfIndex = group.index 
    master_idx = listOfIndex[0] 
    frame['class'].loc[listOfIndex] = frame['class'].loc[master_idx] 



    key1 key2 class 
0  1  2 5 
1  2  2 10 
2  1  2 5 
3  1  2 5 
4  2  2 10 
5  3  4 6 
6  2  2 10 
7  2  2 10 

Antwort

2

Sie können zuerst sort_values durch Spalten key1 und key2, dann replaceNaN zu np.nan, fillna von ffill in Spalte class und letzte sort_index für Änderung index auf ursprüngliche Reihenfolge:

Hinweis: Lösung, wenn der erste Wert arbeitet von Duplikaten in Spalte class ist NICHTNaN.

df = frame.sort_values(by=['key1','key2']) 
print df 
    key1 key2 class 
0  1  2  5 
2  1  2 NaN 
3  1  2 NaN 
1  2  2 10 
4  2  2 NaN 
6  2  2 NaN 
7  2  2 NaN 
5  3  4  6 

df['class'] = df['class'].replace('NaN', np.nan).fillna(method='ffill') 

print df.sort_index() 
    key1 key2 class 
0  1  2 5.0 
1  2  2 10.0 
2  1  2 5.0 
3  1  2 5.0 
4  2  2 10.0 
5  3  4 6.0 
6  2  2 10.0 
7  2  2 10.0 

Wenn die Werte in Spalte class ganze Zahlen sind, gegossen von astype:

df['class'] = df['class'].replace('NaN', np.nan).fillna(method='ffill').astype(int) 
print df.sort_index() 
    key1 key2 class 
0  1  2  5 
1  2  2  10 
2  1  2  5 
3  1  2  5 
4  2  2  10 
5  3  4  6 
6  2  2  10 
7  2  2  10 
+0

Vielen Dank @jezrael. Das funktioniert gut. Ich musste Pandas aktualisieren, weil meine Version nicht 'sort_values' hatte – JMarc

Verwandte Themen