2017-11-28 14 views
0

私はDATAFRAMEがdfが列GENDERAGEIDおよびその他の列を持っているという名前の持っている、とだけ3列あまりにGENDERAGEIDを持ってdf_2という名前の別のデータフレームがあります。 GENDERAGEの値をdfに更新する場合は、値をdf_2に設定します。Fater更新パンダDATAFRAME

だから私のアイデアは

df_id = df.ID.tolist() 
df_2_id = df_2.ID.tolist() 

df = df.set_index('ID') 
df_2 = df_2.set_index('ID') 

# all the ids in df_2_id are in df_id 
for id in tqdm.tqdm_notebook(df_2_id): 
    df.loc[id, 'GENDER'] = df_2.loc[id, 'GENDER'] 
    df.loc[id, 'AGE'] = df_2.loc[id, 'AGE'] 

あるしかし、forループのみ秒あたり17.2回の反復を持っており、それは周りのデータを更新するために2時間かかります。どうすれば速くすることができますか?最後の値を保持し、

idx = df.index.intersection(df_2.index) 
df.loc[idx, 'GENDER'] = df_2['GENDER'] 
df.loc[idx, 'AGE'] = df_2['AGE'] 

それともconcatそれらを一緒にし、重複を削除:

+0

パンダを使用しないと、より速くなります – Flika205

+0

df ['GENDER'] = df_2 ['GENDER'] 'それから' df ['AGE'] = df_2 ['AGE'] 'なぜあなたはforループを 'ID'で使っていますか? –

+0

@ juanpa.arrivillaga、 'df'と' df_2'は異なる形をしているからです。 –

答えて

4

私はあなたがインデックスの最初のintersectionが必要だと思うし、その後値を設定

df = pd.concat([df, df_2]) 
df = df[~df.index.duplicated(keep='last')] 

同様のソリューション:

df = pd.concat([df, df_2]).reset_index().drop_duplicates('ID', keep='last') 

サンプル:

df = pd.DataFrame({'ID':list('abcdef'), 
        'AGE':[5,3,6,9,2,4], 
        'GENDER':list('aaabbb')}) 

#print (df) 


df_2 = pd.DataFrame({'ID':list('def'), 
        'AGE':[90,20,40], 
        'GENDER':list('eee')}) 

#print (df_2) 

df = df.set_index('ID') 
df_2 = df_2.set_index('ID') 

idx = df.index.intersection(df_2.index) 
df.loc[idx, 'GENDER'] = df_2['GENDER'] 
df.loc[idx, 'AGE'] = df_2['AGE'] 

print (df) 
    AGE GENDER 
ID    
a  5  a 
b  3  a 
c  6  a 
d 90  e 
e 20  e 
f 40  e 
+0

こんにちは、申し訳ありませんが、 'df'には' GENDER'、 'AGE'と' ID'以外の列があります。あなたの方法はまだ機能しますか? –

+0

そして 'df_2'はありませんか?それは3列しかありませんか? – jezrael

+0

'df_2'には3列しかありません –