如果密钥丢失,pandas会合并两个具有默认值的数据帧

时间:2018-05-02 01:56:51

标签: python pandas dataframe merge

我有两个数据帧:

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

         NAME
0        sys1
1        sys2

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

我想将它们合并在一起,形成“基础”的排列。和' 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执行此操作,但似乎可以使用合并操作来实现更好的性能。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

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中的重复值。 这不是最简单的方法,但它有效。希望它可以提供帮助。