使用来自另一个数据框的合并填充 na 值

Filling na values with merge from another dataframe

我有一个包含 na 值的列,我想根据键根据另一个数据框中的值来填充这些值。我想知道有没有简单的方法可以做到这一点

示例: 我有一个对象及其颜色的数据框,如下所示:

  object   color
0  chair   black
1   ball  yellow
2   door   brown
3   ball     **NaN**
4  chair   white
5  chair     **NaN**
6   ball    grey

我想用以下数据框中的默认颜色填充颜色列中的 na 值:

  object default_color
0  chair         brown
1   ball          blue
2   door          grey

所以结果将是这样的:

  object   color
0  chair   black
1   ball  yellow
2   door   brown
3   ball     **blue**
4  chair   white
5  chair     **brown**
6   ball    grey

有什么"easy"方法可以做到这一点吗?

谢谢:)

先创建Series然后替换NaNs:

s = df1['object'].map(df2.set_index('object')['default_color'])
print (s)
0    brown
1     blue
2     grey
3     blue
4    brown
5    brown
6     blue
Name: object, dtype: object
df1['color']= df1['color'].mask(df1['color'].isnull(), s)

或者:

df1.loc[df1['color'].isnull(), 'color'] = s

或者:

df1['color'] = df1['color'].combine_first(s)

或者:

df1['color'] = df1['color'].fillna(s)

print (df1)
  object   color
0  chair   black
1   ball  yellow
2   door   brown
3   ball    blue
4  chair   white
5  chair   brown
6   ball    grey

如果 object 中的唯一值:

df = df1.set_index('object')['color']
        .combine_first(df2.set_index('object')['default_color'])
        .reset_index()

或者:

df = df1.set_index('object')['color']
        .fillna(df2.set_index('object')['default_color'])
        .reset_index()

使用 np.where 并通过将列设置为索引进行映射,即

df['color']= np.where(df['color'].isnull(),df['object'].map(df2.set_index('object')['default_color']),df['color'])

df.where

df['color'] = df['color'].where(df['color'].notnull(), df['object'].map(df2.set_index('object')['default_color'])) 
 object   color
0  chair   black
1   ball  yellow
2   door   brown
3   ball    blue
4  chair   white
5  chair   brown
6   ball    grey

使用 loc + map:

m = df.color.isnull()
df.loc[m, 'color'] = df.loc[m, 'object'].map(df2.set_index('object').default_color)

df

  object   color
0  chair   black
1   ball  yellow
2   door   brown
3   ball    blue
4  chair   white
5  chair   brown
6   ball    grey

如果您要进行大量此类替换,您应该在 df2 上调用 set_index 一次并保存其结果。