我有 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["姓名"]
但是它返回此错误:
编辑:两个数据的数据集不同。所以,我只想保存 NaN 数据并忽略 df2 中的现有数据。
所以,我试过了:
if df1["Name"] == df2["Name"]:
result = df2.merge(df1, how='inner')
result.loc[result['Height'].isna(), 'Height'] = result['HeightEach']
它抛出错误:
答案 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