合并具有相同列的多个数据帧并删除nan



假设我有以下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

最新更新