2016-05-02 12 views
1

forループを使用せずに次のコードと同じ結果を得るにはどうすればよいですか?通常のデータは〜500k行です。forループを使用せずに重複のセル値を更新する

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']) 

このデータフレームは、次のように、いくつかの[key1,key2]重複が含まれています[1,2][2,2]。 重複の最初の発生は有限の'class'の値を持ちますが、他の重複は'NaN' classの値が割り当てられています。次のコードでは、最初の発生の値が'class'になり、同じグループの重複に割り当てられます。

元の順序に変更 indexためのコラム classと最後 sort_indexffillによって
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 

答えて

2

あなたができる列key1key2による最初のsort_valuesnp.nanに続いreplaceNaNfillna

お知らせ:ソリューションが第1の値ならば動作します列classの重複の数はNOTNaNです。

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 

classの値は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

おかげでたくさんの@jezrael。これはうまく動作しています。私のバージョンには 'sort_values'がないので、私はパンダを更新しなければなりませんでした。 – JMarc

関連する問題