Pandas设置列的多行值

时间:2018-02-12 09:07:12

标签: python pandas

我有一个数据框(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

我在这里搜索了类似的问题,但是所有这些都涉及为多行分配单个值。我无法想象这里有什么问题。有什么帮助吗?

3 个答案:

答案 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'])