根据行名向 pandas 数据框添加一列,如果行不存在,则将其添加到

add a column to pandas dataframe based on row name, if row doesnt exist add it in

我有以下数据框,df1 是我的主人

df1 = pd.DataFrame([['a', '10'], ['b', '20']],
               columns=['letter', 'Jan'])
df2 = pd.DataFrame([['a', '1'], ['b', '2'], ['c', '2']],
               columns=['letter', 'feb'])
df3 = pd.DataFrame([['a', '10'], ['b', '20'], ['c', '20'], ['d', '20']],
               columns=['letter', 'march'])

如何将 df2 然后 df3 添加到 df1,使其看起来如下所示。

 Letter jan feb march
0   a     10  1   10
1   b     20  2   20
2   c         2   20
3   d             20



res = pd.concat([df1, df2,df3])

我厌倦了这个,而且不断添加信件,这不是我想要的

  letter  Jan  feb march
0      a   10  NaN   NaN
1      b   20  NaN   NaN
0      a  NaN    1   NaN
1      b  NaN    2   NaN
2      c  NaN    2   NaN
0      a  NaN  NaN    10
1      b  NaN  NaN    20
2      c  NaN  NaN    20
3      d  NaN  NaN    20
 

知道如何解决这个问题吗? 谢谢

使用DataFrame.merge to outer merge the dataframes df1, df2 and df3 on letter then use DataFrame.fillna填充NaN值:

df = (
    df1.merge(df2, on='letter', how='outer')
    .merge(df3, on='letter', how='outer').fillna('')
)

或者,如果有大量需要合并的数据帧,我们可以使用 reduce + pd.merge 使用更简洁的解决方案,并将需要合并的数据帧列表传递给 reduce 函数:

from functools import reduce

df = reduce(lambda x, y:
            pd.merge(x, y, on='letter', how='outer'), [df1, df2, df3]).fillna('')

结果:

# print(df)

  letter Jan feb march
0      a  10   1    10
1      b  20   2    20
2      c       2    20
3      d            20

这是您问题的解决方案。

df_outer = pd.merge(df1, df2, on='letter', how='outer')
df_outer = pd.merge(df_outer, df3, on='letter', how='outer')
df_outer = df_outer.fillna('')
df_outer