5

我有一列包含 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

有什么“简单”的方法可以做到这一点吗?

谢谢 :)

4

3 回答 3

8

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'])) 
物体颜色
0 椅子黑色
1球黄色
2门棕色
3球蓝
4椅白色
5 椅子棕色
6球灰
于 2017-11-08T09:54:53.527 回答
6

先创建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()
于 2017-11-08T09:53:08.483 回答
5

使用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

如果您要进行很多这样的替换,您应该只调用set_index一次df2并保存其结果。

于 2017-11-08T10:00:14.643 回答