更新pandas DataFrame

时间:2017-11-28 09:46:36

标签: python pandas

我有一个名为df的DataFrame包含列GENDERAGEID以及其他列,还有另一个名为df_2的DataFrame只有还有3列GENDERAGEID。我想使用GENDER中的值更新AGEdfdf_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个小时才能更新数据。我怎样才能让它更快?

1 个答案:

答案 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