我有一个名为df
的DataFrame包含列GENDER
,AGE
和ID
以及其他列,还有另一个名为df_2
的DataFrame只有还有3列GENDER
,AGE
和ID
。我想使用GENDER
中的值更新AGE
中df
和df_2
的值。
所以我的想法是
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个小时才能更新数据。我怎样才能让它更快?
答案 0 :(得分:4)
我认为您需要首先intersection
个索引,然后设置值:
idx = df.index.intersection(df_2.index)
df.loc[idx, 'GENDER'] = df_2['GENDER']
df.loc[idx, 'AGE'] = df_2['AGE']
或concat
他们在一起并删除重复项,保留最后一个值:
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