我有两个数据帧:
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执行此操作,但似乎可以使用合并操作来实现更好的性能。
感谢您的帮助。
答案 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
中的重复值。
这不是最简单的方法,但它有效。希望它可以提供帮助。