繁体   English   中英

根据行名向 pandas dataframe 添加一列,如果行不存在,则添加

[英]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将数据帧df1df2df3外部合并,然后使用letter DataFrame.fillna NaN值:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM