【问题标题】:Pandas: merge dataframes without creating new columnsPandas:合并数据框而不创建新列
【发布时间】:2017-05-06 20:29:01
【问题描述】:

我有 2 个具有相同列的数据框:

df1 = pd.DataFrame([['Abe','1','True'],['Ben','2','True'],['Charlie','3','True']], columns=['Name','Number','Other'])
df2 = pd.DataFrame([['Derek','4','False'],['Ben','5','False'],['Erik','6','False']], columns=['Name','Number','Other'])

给出:

     Name Number Other
0      Abe      1  True
1      Ben      2  True
2  Charlie      3  True

    Name Number  Other
0  Derek      4  False
1    Ben      5  False
2   Erik      6  False

我想要一个输出数据框,它是基于“名称”的两者的交集:

output_df = 
        Name Number  Other
    0    Ben      2  True
    1    Ben      5  False

我已经尝试了基本的 pandas 合并,但返回是不可取的:

pd.merge(df1,df2,how='inner',on='Name') = 
 Name Number_x Other_x Number_y Other_y
0  Ben        2    True        5   False

这些数据帧非常大,所以我更喜欢使用一些 pandas 魔法来保持快速。

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    您可以使用concat,然后使用boolean indexing 过滤isinnumpy.intersect1d

    val = np.intersect1d(df1.Name, df2.Name)
    print (val)
    ['Ben']
    
    df = pd.concat([df1,df2], ignore_index=True)
    print (df[df.Name.isin(val)])
      Name Number  Other
    1  Ben      2   True
    4  Ben      5  False
    

    val 的另一种可能的解决方案是 intersection 的集合:

    val = set(df1.Name).intersection(set(df2.Name))
    print (val)
    {'Ben'}
    

    然后可以将索引重置为单调:

    df = pd.concat([df1,df2])
    print (df[df.Name.isin(val)].reset_index(drop=True))
      Name Number  Other
    0  Ben      2   True
    1  Ben      5  False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2020-04-10
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多