【问题标题】:python pandas: merge two data frame but didn't merge the repeat rowspython pandas:合并两个数据框但没有合并重复行
【发布时间】:2017-01-06 04:42:08
【问题描述】:

我有两个数据框:df1 和 df2。

df1 如下:

    name  exist
     a      1
     b      1
     c      1
     d      1
     e      1

df2(只有一列:名称)如下:

     name  
      e      
      f      
      g      
      a     
      h     

我想合并这两个dataframe,并没有合并重复的名字,我的意思是,如果df2中的名字存在于df1中,只显示一次,否则如果名字是df2,则df1中不存在,设置为存在值为 0 或 Nan。比如df1(有a和e),df2(有a和e,只显示a,e一次),我想成为下面的df:

     a      1
     b      1
     c      1
     d      1
     e      1
     f      0 
     g      0
     h      0

我使用了 concat 函数,我的代码如下:

import pandas as pd


df1 = pd.DataFrame({'name': ['a', 'b', 'c', 'd', 'e'],
                'exist': ['1', '1', '1', '1', '1']})
df2 = pd.DataFrame({'name': ['e', 'f', 'g', 'h', 'a']})
df = pd.concat([df1, df2])
print(df)

但结果错误(名称a和e重复显示):

  exist name
 0     1    a
 1     1    b 
 2     1    c
 3     1    d
 4     1    e
 0   NaN    e
 1   NaN    f
 2   NaN    g
 3   NaN    h
 4   NaN    a

请举手,提前谢谢!

【问题讨论】:

    标签: python pandas merge concat


    【解决方案1】:

    如您的标题所示,您可以使用merge 代替concat 并将how 参数指定为outer,因为您希望保留来自df1df2 的所有记录,这定义了一个外连接:

    import pandas as pd
    pd.merge(df1, df2, on = 'name', how = 'outer').fillna(0)
    
    # exist name
    # 0   1    a
    # 1   1    b
    # 2   1    c
    # 3   1    d
    # 4   1    e
    # 5   0    f
    # 6   0    g
    # 7   0    h
    

    【讨论】:

    • 感谢@Psidom 的回答,我会接受的。你能详细告诉我how ='outer'的含义吗,我的意思是left,right,inner,butter的区别。谢谢!
    • 检查这个pandas.pydata.org/pandas-docs/stable/generated/…和这个stackoverflow.com/questions/448023/…。粗略地说,连接是一种基于某些关键列的表匹配; left 保留第一个数据帧中的所有记录; right 保留第二个数据帧中的所有记录; inner 只保留数据帧中存在的记录,而 external 保留所有记录。
    • @tktktk0711,这是关于 DataFrame merge youtu.be/9d5-Ti6onew?t=13m7s 发生了什么的可视化指南
    猜你喜欢
    • 2019-01-21
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2022-01-27
    • 2015-04-17
    • 2015-10-17
    • 2018-03-14
    相关资源
    最近更新 更多