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

时间:2021-07-22 03:10:25

标签: python python-3.x pandas dataframe

假设我有以下 ma​​in df:

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 个数据帧中的数据合并到 df 列上的主 name 并删除 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      

1 个答案:

答案 0 :(得分:1)

我们可以尝试将 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
相关问题