将数据框特定列中的 Nan 值替换为另一个数据框特定列中的值

Posted

技术标签:

【中文标题】将数据框特定列中的 Nan 值替换为另一个数据框特定列中的值【英文标题】:Replacing Nan value from specific column of a dataframe with value from specific column of another dataframe 【发布时间】:2020-04-14 19:12:18 【问题描述】:

我在用其他数据框的列值替换数据框一列中的 nan 值时遇到问题。 这是测试示例:

    Name  Age Name2
0    tom   10   tom
1   nick   15  nick
2   juli   14  juli
3    NaN   12  anne
4  error   17   neo

我想用来自其他数据帧的特定值替换列 Name 中的 Nan 值(如果其中有一些 Nan 值,则不是其他列),例如来自此数据帧的 Name2 值:

    Name  Age Name2
4  error   17   neo

我想得到的是这样的:

    Name  Age Name2
0    tom   10   tom
1   nick   15  nick
2   juli   14  juli
3    neo   12  anne
4  error   17   neo

这是此示例的测试代码:

# initialize list of lists 
data = [['tom', 10, 'tom'], ['nick', 15, 'nick'], ['juli', 14, 'juli'], [np.nan, 12, 'anne'], ['error', 17, 'neo']] 

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Age', 'Name2']) 

df1=df[df.Age==np.max(df.Age)]

然后我尝试了这三种方法,但都没有奏效 - 我的数据框始终保持 Nan 值。

df.Name.fillna(df1.Name2, inplace=True)

df.where(df.Name.isnull(), df1.Name2, axis=0)

df[df.Name.isnull()].Name=df1.Name2

你能告诉我哪里出错了吗?

【问题讨论】:

dfdf1是哪一个? 较大的是df,较小的是df1。 【参考方案1】:

这里有必要将一个元素Series 转换为标量:

df.Name.fillna(df1.Name2.iat[0], inplace=True)
#assign output to new DataFrame, test for not missing values
df = df.where(df.Name.notna(), df1.Name2.iat[0])
#use DataFrame.loc for avoid SettingWithCopyWarning
df.loc[df.Name.isnull(), 'Name']=df1.Name2.iat[0]

print (df)
    Name  Age Name2
0    tom   10   tom
1   nick   15  nick
2   juli   14  juli
3    neo   12  anne
4  error   17   neo

详情

print (df1.Name2)
4    neo
Name: Name2, dtype: object

print (df1.Name2.iat[0])
neo

【讨论】:

以上是关于将数据框特定列中的 Nan 值替换为另一个数据框特定列中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何从连接的数据框列中替换 NaN?

Pandas - 用特定组的平均值替换列中的 NaN

用数据框的NaN替换特定范围的值

python如何检查数据框中的值是不是为nan [重复]

使用 dplyr [重复] 有条件地将一列中的值替换为另一列中的值

从数据框中的列中获取第一个和最后一个值