【问题标题】:merging multiple dataframes with the same columns and remove nans合并具有相同列的多个数据框并删除 nans
【发布时间】:2021-09-29 08:55:17
【问题描述】:

假设我有以下 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 个数据帧中的数据合并到 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      

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 2021-03-06
      • 2012-11-26
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      相关资源
      最近更新 更多