【问题标题】:Replace null values in a dataframe using another dataframe使用另一个数据框替换数据框中的空值
【发布时间】:2021-03-05 05:12:54
【问题描述】:

我正在尝试使用数据框 f 替换数据框 d 中的空值。

dfEGI 链接。在d 中,EGI 是一个列并且不是唯一的。在f 中,EGI 是唯一的,并且是此数据帧的索引。

对于d 中的每一行,我需要该行中的值被f 中的行与对应的EGI“屏蔽”。

样本数据:

d = pd.DataFrame({'EGI':['a1','b2','a1','d4'],'A': ['x', np.nan, 'z', 'e'], 'B': [pd.NaT, 6, 7, 9], 'C': [2, 1, None, 9], 'D': [2, None, np.nan, None]})

  EGI    A    B    C    D
0  a1    x  NaT  2.0  2.0
1  b2  NaN    6  1.0  NaN
2  a1    z    7  NaN  NaN
3  d4    e    9  9.0  NaN
f = pd.DataFrame({'B': [5, 8, 9], 'A': ['w', 'y', np.nan], 'D': [None, np.nan, 8], 'test': [5, 8, 9]}, index=['b2', 'a1', 'c3'])

    B    A    D  test
b2  5    w  NaN     5
a1  8    y  NaN     8
c3  9  NaN  8.0     9

预期输出:

  EGI    A    B    C    D
0  a1    x    8  2.0  2.0
1  b2    w    6  1.0  NaN
2  a1    z    7  NaN  NaN
3  d4    e    9  9.0  NaN

我尝试了什么:

m = d.isnull()
m.index = d['EGI'].tolist()
m = m.drop(['EGI'], axis = 1)
d.mask(m, f)

   EGI    A    B   C   D
0  NaN  NaN  NaN NaN NaN
1  NaN  NaN  NaN NaN NaN
2  NaN  NaN  NaN NaN NaN
3  NaN  NaN  NaN NaN NaN

【问题讨论】:

  • 一种最简单的方法是,合并两个数据帧并将左列的 nan 填充到右列,然后删除右列。

标签: python pandas dataframe mask


【解决方案1】:

如果数据框df 有匹配的行索引,我们可以只使用fillna

d.fillna(f)

但是在 OP 的例子中,索引不匹配,所以我们只需要先对齐它们。


单线

使用set_indexreindex 将索引对齐到EGI 然后fillna

d.set_index('EGI').fillna(f.reindex(d.EGI))

#    EGI  A    B    C    D
# 0   a1  x  8.0  2.0  2.0
# 1   b2  w    6  1.0  NaN
# 2   a1  z    7  NaN  NaN
# 3   d4  e    9  9.0  NaN

一步一步

  1. 使用set_indexd的索引设置为EGI

    d = d.set_index('EGI')
    
    #        A    B    C    D
    # EGI                    
    # a1     x  NaT  2.0  2.0
    # b2   NaN    6  1.0  NaN
    # a1     z    7  NaN  NaN
    # d4     e    9  9.0  NaN
    
  2. 使用reindexf 的索引与d 的索引对齐:

    f = f.reindex(d.index)
    
    #        B    A   D  test
    # EGI                    
    # a1   8.0    y NaN   8.0
    # b2   5.0    w NaN   5.0
    # a1   8.0    y NaN   8.0
    # d4   NaN  NaN NaN   NaN
    
  3. 使用fillnaf 填充d 的NaN:

    d.fillna(f)
    
    #    EGI  A    B    C    D
    # 0   a1  x  8.0  2.0  2.0
    # 1   b2  w    6  1.0  NaN
    # 2   a1  z    7  NaN  NaN
    # 3   d4  e    9  9.0  NaN
    

注意df 索引没有对齐,也不需要对齐。我们只需要对齐 row 索引,其余的由fillna 处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2019-06-30
    • 2022-01-23
    • 1970-01-01
    • 2021-02-18
    • 2019-03-23
    相关资源
    最近更新 更多