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”])