2016-04-14 39 views
0

我有三个dataframes:合并时,从两个数据帧中选择相同列的非空值?

df1 = pd.DataFrame({'code': [123, 124], 'name': ['Manchester', 'Liverpool']}) 
df2 = pd.DataFrame({'code': [123], 'group': ['b'], 'items_highcost': [10]}) 
df3 = pd.DataFrame({'code': [123, 124], 'group': ['b', 'c'], 'items_not_highcost': [11, 8]}) 

我想将它们合并到一个单一的框架,但不包括不在df1任何行,所以我做的两个左联接:

df_merged = pd.merge(df1, df2, on='code', how='left') 
df_merged = pd.merge(df_merged, df3, on='code', how='left') 

这给我下面的合并数据集:

code  name group_x items_highcost group_y items_not_highcost 
0 123 Manchester  b    10  b     11 
1 124 Liverpool  NaN    NaN  c     8 

但我希望这是对每行一个group列,与非NU其值为group,无论是从df2还是df3或两者兼而有之。 (这是安全的假设的group值将是相同的df2df3相同的代码,因为他们是来自同一个数据源来了。)

现在我这样做:

def get_group(row): 
    if row['group_x']: return row['group_x'] 
    if row['group_y']: return row['group_y'] 
    return None 
df_merged['group'] = df_merged.apply(get_group, axis=1) 
df_merged.drop(['group_x', 'group_y'], inplace=True, axis=1) 

这个工程,但很丑。理想情况下,我不会有group_xgroup_y的中间步骤,但可以在一个步骤中获得非空值。有没有更好的办法?

回答

0

它看起来像你正在做的是填补遗漏值在这种情况下,你可以改为调用combine_first依次为:

In [196]: 
df1.combine_first(df2).combine_first(df3) 

Out[196]: 
    code group items_highcost items_not_highcost  name 
0 123  b   10.0    11.0 Manchester 
1 124  c    NaN     8.0 Liverpool 
+0

谢谢 - 你的意思做的,而不是'merge'呢? – Richard

+0

在你的情况下,这将会更简单,而且更多的是你在填充缺失值时要做的事情 – EdChum