我有一个数据框(train
),其中包含Age
列。此列缺少值。我已将其与另一个数据框static_values
合并,该数据框也有Age
列。我使用以下行代替Age
df中train
列的缺失值。
predicted_vals = pd.merge(static_vals, train, on=['Pclass','Sex'])
# num of missing values
predicted_vals.loc[predicted_vals['Age_y'].isna(),'Age_y'].isna().sum() # 177
predicted_vals.loc[predicted_vals['Age_y'].isna(),'Age_y'] = predicted_vals.loc[predicted_vals['Age_y'].isna(),'Age_x']
运行上面的行之后,我运行以下命令以查看值是否已被替换 -
predicted_vals.loc[predicted_vals['Age_y'].isna(),'Age_y']
这是我得到的投入 -
Series([], Name: Age_x, dtype: float64)
它空洞。没有任何转让。奇怪的是,当我在运行上面的行之后检查Age_x
列的值时,我也会得到一个空白。
>>> predicted_vals.loc[predicted_vals['Age_y'].isna(),'Age_x']
Series([], Name: Age_x, dtype: float64)
下面是我在运行我尝试分配缺失值的行之前的列所持有的内容
>>> predicted_vals.loc[predicted_vals['Age_y'].isna(),'Age_x'].head()
3 34.240964
8 34.240964
15 34.240964
25 34.240964
34 34.240964
我在这里搜索了类似的问题,但是所有这些都涉及为多行分配单个值。我无法想象这里有什么问题。有什么帮助吗?
答案 0 :(得分:2)
这里真的有问题吗?
predicted_vals.loc[predicted_vals['Age_y'].isna(),'Age_y']
应该是空的,因为你已经填满了价值观!试试predicted_vals.loc[~predicted_vals['Age_y'].isna(),'Age_y']
答案 1 :(得分:1)
这是一种替代解决方案,可避免合并和处理列名后缀。我们对齐2个索引并使用fillna
来映射static_vals
。
predicted_vals = predicted_vals.set_index(['Pclass','Sex'])
predicted_vals['Age'] = predicted_vals['Age'].fillna(static_vals.set_index(['Pclass','Sex'])['Age'])
predicted_vals = predicted_vals.reset_index()
如果您想进行明确的合并,@jezrael's solution是可行的方法。
答案 2 :(得分:1)
我认为你需要combine_first
:
predicted_vals['Age_y'] = predicted_vals['Age_y'].combine_first(predicted_vals['Age_x'])