【问题标题】:pandas merge two dataframes with default value if key missing如果缺少键,熊猫将两个数据帧与默认值合并
【发布时间】:2018-10-12 01:29:53
【问题描述】:

我有两个数据框:

                              NAME      base         RED
3                                %      free        2.00
4                                %   freemem        0.10
5                             sys1   freemem        0.20

         NAME
0        sys1
1        sys2

还有其他列,也必须存在于输出数据框中,但它们不包含键值,为了描述的清晰,只保留了一个非键。

我想将它们合并在一起,为名称中的每个值形成“base”和“red”的排列。关键点是,如果 df2.NAME 中的值作为 df1.NAME 中的值出现,则在形成合并时应优先考虑该行。否则,'red' 的值应取自名称为 '%' 的行。

例如,对于上面的值,我希望输出看起来像:

   NAME     base   RED
0  sys1     free  2.00
1  sys1  freemem  0.20
2  sys2     free  2.00
3  sys2  freemem  0.10

我可以考虑如何使用 apply 来执行此操作,但似乎应该可以使用合并操作来获得更好的性能。

感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    尝试以下方法:

    import pandas as pd
    import numpy as np
    # Create sample
    d = dict()
    d['name'] = np.array(['%','%','sys1'])
    d['base'] = np.array(['free','freemem','freemem'])
    d['red'] = np.array([2,0.1,0.2])
    df1 = pd.DataFrame(d)
    df1 = df1[['name','base','red']]
    df2 = pd.DataFrame(np.array(['sys1','sys2']),columns=['name'])
    ################################################
    part1 = df1[df1['name']!='%']
    part2 = pd.DataFrame()
    for i in df2.values:
        copy = df1[df1['name']=='%'].copy()
        copy['name'] = np.repeat(i,len(copy['name']) )
        part2 = part2.append(copy)
    '''
    Part 1:
       name     base  red
    2  sys1  freemem  0.2
    
    Part 2:
       name     base  red
    0  sys1     free  2.0
    1  sys1  freemem  0.1
    0  sys2     free  2.0
    1  sys2  freemem  0.1
    '''
    ans = pd.merge(part1,part2, how='outer')
            .drop_duplicates(['name','base'])
    print ans.sort_values(['name', 'base'], ascending=[True, True])
    Out[]:
       name     base  red
    1  sys1     free  2.0
    0  sys1  freemem  0.2
    3  sys2     free  2.0
    4  sys2  freemem  0.1
    

    因为pd.merge(part1,part2, how='outer') 会将part1 放在part2 之上,而应用drop_duplicates() 将删除part2 中的重复值。 这不是最简单的方法,但它有效。希望对您有所帮助。

    【讨论】:

    • @user3662805 我上面的解决方案能解决你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2019-12-07
    • 2019-07-20
    • 2019-01-17
    • 2017-06-11
    • 2016-01-01
    相关资源
    最近更新 更多