【问题标题】:Filling na values with merge from another dataframe使用来自另一个数据框的合并填充 na 值
【发布时间】:2018-04-20 22:42:30
【问题描述】:

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

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

谢谢:)

【问题讨论】:

标签: python pandas dataframe merge fillna


【解决方案1】:

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

【讨论】:

  • 不错的一个在哪里。
  • 是的,只是给你们一些空间。 ;-)
  • 我的前 10000 次重复 8 次:0。也给我一些空间来回答下一个问题 :)
  • 恭喜 10k :)
【解决方案2】:

先创建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()

【讨论】:

    【解决方案3】:

    使用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 一次并保存其结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多