使用 Python 条件将空值替换为其他值

时间:2021-06-17 09:48:55

标签: python dataframe

我有 2 个不同行数的数据框。所以,让我们说:

df1 = {'Name': ['Tom', 'Joseph', 'Krish', 'John','Micheal'], 'Age': [20, 21, 19, 18, 23], 'HeightEach': [156, 167,149 , 151, 149]}  
df2 = {'Name': ['Tom', 'Joseph', 'Krish', 'John'], 'Age': [20, 21, 19, 18], 'Height': [179, NaN,159 , NaN]}  

现在的问题是,我想用 df1 中的相同值替换 'Height' 列中的空值。到目前为止,我只知道如何像下面的代码一样用 0 替换 NaN:

 df1['Height'] = df1['Height'].replace(np.nan, 0)

但是,我不知道如何用这种条件替换 NaN:

  • 如果 df1 和 df2 中的名称相同,则将 df1 中的 NaN 替换为相同的 height。我试着像下面的简单代码那样做,至少得到同名的数据:

    df1['Height'] = df1["姓名"] == df2["姓名"]

但是它返回此错误:

enter image description here

编辑:两个数据的数据集不同。所以,我只想保存 NaN 数据并忽略 df2 中的现有数据。

所以,我试过了:

if df1["Name"] == df2["Name"]:
    result = df2.merge(df1, how='inner')
    result.loc[result['Height'].isna(), 'Height'] = result['HeightEach']

它抛出错误:

enter image description here

1 个答案:

答案 0 :(得分:1)

左合并df2和df1,然后用NaN填充HeightEach

result = df2.merge(df1, how='left')
result.loc[result['Height'].isna(), 'Height'] = result['HeightEach']

     Name  Age  Height  HeightEach
0     Tom   20   156.0         156
1  Joseph   21   167.0         167
2   Krish   19   149.0         149
3    John   18   151.0         151

如果 df2 中的所有值都没有 df1 中的值,则它可能不起作用,您可能希望先进行内部合并并在该场景中填充 NaN 值。

result = df2.merge(df1, how='inner')
result.loc[result['Height'].isna(), 'Height'] = result['HeightEach']

df2.append(result)[['Name', 'Age', 'Height']].drop_duplicates(keep='last').dropna()
     Name  Age  Height
0     Tom   20   156.0
1  Joseph   21   167.0
2   Krish   19   149.0
3    John   18   151.0