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中的内容是什么?