假设我有以下maindf:
df = pd.DataFrame({'name':['Sara', 'John', 'Christine']})
df:
name
0 Sara
1 John
2 Christine
现在,我有4个其他dfs,年龄和等级适用于3个用户名,但NaN排列不同:
df2 = pd.DataFrame({'name':['Sara', 'John', 'Christine'],
'age': [26, 30, np.nan]})
df3:
df3 = pd.DataFrame({'name': ['Sara', 'John', 'Christine'],
'age': [np.nan, 30, 24]})
df4:
df4 = pd.DataFrame({'name': ['Sara', 'John', 'Christine'],
'grade': [np.nan, 1, 3]})
df5:
df5 = pd.DataFrame({'name': ['Sara', 'John', 'Christine'],
'grade': [12, np.nan, 3]})
我想将4个数据帧中的数据合并到name
列上的主df
,并删除NaN。
到目前为止我做了什么:
创建了dfs:的列表
dfs = [df,df2,df3,df4,df5]
使用的reduce
:
from functools import reduce
df_final = reduce(lambda left,right: pd.merge(left,right,on='name'), dfs)
df_final:
name age_x age_y grade_x grade_y
0 Sara 26.0 NaN NaN 12.0
1 John 30.0 30.0 1.0 NaN
2 Christine NaN 24.0 3.0 3.0
预期输出:
df_final:
name age grade
0 Sara 26.0 12
1 John 30.0 1.0
2 Christine 24.0 3.0
我们可以尝试将long与concat
合并,然后使用groupby first
为每个名称检索每个列的第一个有效条目:
merged = (
pd.concat(dfs).groupby('name', sort=False, as_index=False).first()
)
merged
:
name age grade
0 Sara 26.0 12.0
1 John 30.0 1.0
2 Christine 24.0 3.0