Python 如何基于另一个数据帧中的列更新数据帧中的列
假设我有两个数据帧Python 如何基于另一个数据帧中的列更新数据帧中的列,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有两个数据帧 df1=pd.DataFrame({'name':['Jack','Lucy','Mark'],'age':[1,2,3]}) df2=pd.DataFrame({'name':['Jack','Mark'],'age':[10,11],'address':['addr1','addr2']}) 我应该使用什么操作使df1成为 name age address -------------------- Jack 10 addr1 Lucy 2
df1=pd.DataFrame({'name':['Jack','Lucy','Mark'],'age':[1,2,3]})
df2=pd.DataFrame({'name':['Jack','Mark'],'age':[10,11],'address':['addr1','addr2']})
我应该使用什么操作使df1成为
name age address
--------------------
Jack 10 addr1
Lucy 2 NaN
Mark 11 addr2
使用由name
列转换为两个DataFrame
s中的索引:
df1 = df1.set_index('name')
df2 = df2.set_index('name')
df1 = df2.combine_first(df1).reset_index()
print (df1)
name address age
0 Jack addr1 10.0
1 Lucy NaN 2.0
2 Mark addr2 11.0
应更改第一个原始解决方案:
df1 = df1.set_index('name')
df2 = df2.set_index('name')
df1 = df1.reindex(df1.columns.union(df2.columns, sort=False), axis=1)
df1.update(df2)
df1 = df1.reset_index()
print (df1)
name age address
0 Jack 10.0 addr1
1 Lucy 2.0 NaN
2 Mark 11.0 addr2
或具有左连接的解决方案,并且:
使用由name
列转换为两个DataFrame
s中的索引:
df1 = df1.set_index('name')
df2 = df2.set_index('name')
df1 = df2.combine_first(df1).reset_index()
print (df1)
name address age
0 Jack addr1 10.0
1 Lucy NaN 2.0
2 Mark addr2 11.0
应更改第一个原始解决方案:
df1 = df1.set_index('name')
df2 = df2.set_index('name')
df1 = df1.reindex(df1.columns.union(df2.columns, sort=False), axis=1)
df1.update(df2)
df1 = df1.reset_index()
print (df1)
name age address
0 Jack 10.0 addr1
1 Lucy 2.0 NaN
2 Mark 11.0 addr2
或具有左连接的解决方案,并且:
您可以合并两个df,然后替换缺少的值:
df_out = df1.merge(df2,on=['name'],how='left')
df_out['age'] = df_out.apply(lambda x : x['age_y'] if x['age_y']>0 else x['age_x'],axis = 1)
df_out[['name','age','address']]
输出
| name | age | address |
|:-------|------:|:----------|
| Jack | 10 | addr1 |
| Lucy | 2 | nan |
| Mark | 11 | addr2 |
您可以合并两个df,然后替换缺少的值:
df_out = df1.merge(df2,on=['name'],how='left')
df_out['age'] = df_out.apply(lambda x : x['age_y'] if x['age_y']>0 else x['age_x'],axis = 1)
df_out[['name','age','address']]
输出
| name | age | address |
|:-------|------:|:----------|
| Jack | 10 | addr1 |
| Lucy | 2 | nan |
| Mark | 11 | addr2 |
您可以使用concat、删除重复项、排序索引和重置索引
df = pd.concat([df1,df2],ignore_index=False, sort=False).drop_duplicates(["name"], keep="last").sort_index().reset_index(drop=True)
您可以使用concat、删除重复项、排序索引和重置索引
df = pd.concat([df1,df2],ignore_index=False, sort=False).drop_duplicates(["name"], keep="last").sort_index().reset_index(drop=True)
嗨,耶兹雷尔,谢谢你的回答。我已经更新了我的问题。还有什么是df2的另一个专栏我也想添加到df1?嗨,耶兹雷尔,谢谢你的回答。我已经更新了我的问题。df2中还有一列我想添加到df1中的内容是什么?