【问题标题】:Merge Two different dataframe with Pandas用 Pandas 合并两个不同的数据框
【发布时间】:2018-05-23 14:55:34
【问题描述】:

我是pandas新手,需要完成以下任务,有没有有效的方法呢? 有 2 个不同的数据帧,dfa 和 dfb:

我用它把它们合并在一起:

df = pd.merge(dfa, dfb, left_on = ['a_retry','a_cca', 'a_rssif', 'a_lqif'], right_on = ['b_retry','b_cca', 'b_rssif', 'b_lqif'])

我得到了 df 输出:

但这不是我的期望。 合并后的数据框包含所有列,可以,但行数不得超过较小的行(又名 dfa),这意味着必须删除第 3 行,预期的行是: 我怎样才能做到这一点?谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是预期的,因为所有 4 列都有重复。

    所以需要通过drop_duplicates删除重复行:

    dfa = dfa.drop_duplicates(subset=['a_retry','a_cca', 'a_rssif', 'a_lqif'])
    dfb = dfb.drop_duplicates(subset=['b_retry','b_cca', 'b_rssif', 'b_lqif'])
    

    但是如果需要匹配重复行,是否可以使用cumcount 的新列,用于merge

    dfa['new'] = dfa.groupby(['a_retry','a_cca', 'a_rssif', 'a_lqif']).cumcount()
    dfb['new'] = dfb.groupby(['b_retry','b_cca', 'b_rssif', 'b_lqif']).cumcount()
    
    df = (pd.merge(dfa, 
                   dfb, 
                   left_on = ['a_retry','a_cca', 'a_rssif', 'a_lqif', 'new'], 
                   right_on = ['b_retry','b_cca', 'b_rssif','b_lqif', 'new']).drop('new', axis=1))
    

    【讨论】:

    • 似乎它适用于小数据集,当我用更大的数据集验证解决方案时,df 返回空,不知道为什么......
    • 您可以检查print(dfa.dtypes)print (dfb.dtypes) - 匹配列需要相同
    • @RuiHuang - 检查this以获得更好的解释。
    • 谢谢,得到以下输出: a_retry int64 a_cca int64 a_rssif int64 a_lqif int64 new int64 dtype: object b_retry int64 b_cca int64 b_rssif int64 b_lqif int64 new int64 dtype: object, 我需要关注 dtype: object ?
    • @RuiHuang - 所有列都是int64,所以它应该可以工作。是否可以手动添加一些行进行匹配?因为看起来大数据不匹配……
    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 2015-10-17
    • 2018-03-14
    • 1970-01-01
    • 2020-02-19
    • 2019-12-16
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多