[英]Replacing NaN values in a column from a second column
我想用相应的Node
值替换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 语句来检查节点的Target
是否等于 NaN:如果是,则可以将自己分配为目标。
是的, df.fillna(value, ...)
将允许value
(replacement) arg 成为 Series (column) ,而不仅仅是一个常量:
df['Target'] = df['Target'].fillna(df['Node'])
请注意,这比 if...else 逻辑要好,因为它对整个 dataframe 进行了一个矢量化分配,如下面的测试用例所示。
df.fillna()
不允许我们这样做: 您还可以在您感兴趣的列上使用df.where()
,其中df.where(... other)
arg 是您的替换列df['Node']
:
df['Target'] = df['Target'].where(df['Target'].notna(), df['Node'])
还要注意我们如何使用逻辑索引,使用df['Target'].notna()
来获取目标为/不是 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+')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.