Python 从第二列替换列中的NaN值

Python 从第二列替换列中的NaN值,python,pandas,Python,Pandas,我想将Target中的NaN值替换为相应的节点值。 我的数据是: Node Target Color node1 node7 Red node1 node9 Red node3 node5 Green node1 node3 Red node3 node1 Red node5 NaN Yellow 我需要: Node Target Color node1 node7 Red node1 no

我想将
Target
中的
NaN
值替换为相应的
节点
值。 我的数据是:

 Node  Target   Color
node1   node7   Red
node1   node9   Red
node3   node5   Green
node1   node3   Red
node3   node1   Red
node5   NaN     Yellow
我需要:

   Node  Target     Color
    node1   node7   Red
    node1   node9   Red
    node3   node5   Green
    node1   node3   Red
    node3   node1   Red
    node5   node5   Yellow # here the replacement
我认为一个可能的解决方案是使用if语句检查节点的
目标是否等于NaN:如果是,则可以将自身指定为目标。

是,将允许
(替换)arg为一个系列(列)
,而不仅仅是一个常量:

df['Target'] = df['Target'].fillna(df['Node'])
注意,这比if…else逻辑要好,因为它对整个数据帧执行一个矢量化赋值,如下面的测试用例所示


  • 或者,如果
    df.fillna()
    不允许我们这样做:
  • 您也可以在感兴趣的列上使用,其中df.where(…other)
    arg是您的替换列,
    df['Node']

    df['Target'] = df['Target'].where(df['Target'].notna(), df['Node'])
    
    还要注意我们是如何使用逻辑索引的,使用
    df['Target'].notna()
    来获得Target为/不是NA的行的掩码/逻辑向量

    更好的测试用例:

    import pandas as pd
    from io import StringIO
    
    df = """ Node  Target   Color
    node1   node7   Red
    node1   node9   Red
    node2   NaN     Brown
    node3   node5   Green
    node1   node3   Red
    node3   node1   Red
    node5   NaN     Yellow"""
    
    df = pd.read_csv(StringIO(df), sep=r'\s+')
    
    df[“Target”]=df[“Target”].fillna(df[“Node”])