Python fillna()和loc()的赋值显然不起作用
我到处寻找答案,但找不到 我的目标是:我尝试在数据帧中填充一些缺失的值,使用监督学习来决定如何填充它 我的代码如下所示:注意——第一部分并不重要,它只是提供上下文 到目前为止,一切顺利。我有我的2381个预测,我只需要其中的几个,里面没有NaN值,为什么预测中会有NaN值?我只是想确定一下,因为我不明白我的错误 在这里,我尝试将预测分配给我的数据帧:Python fillna()和loc()的赋值显然不起作用,python,pandas,numpy,supervised-learning,fillna,Python,Pandas,Numpy,Supervised Learning,Fillna,我到处寻找答案,但找不到 我的目标是:我尝试在数据帧中填充一些缺失的值,使用监督学习来决定如何填充它 我的代码如下所示:注意——第一部分并不重要,它只是提供上下文 到目前为止,一切顺利。我有我的2381个预测,我只需要其中的几个,里面没有NaN值,为什么预测中会有NaN值?我只是想确定一下,因为我不明白我的错误 在这里,我尝试将预测分配给我的数据帧: #test_1 df.loc[df['my_colum'].isna(), 'my_colum'] = series_pred #I assig
#test_1
df.loc[df['my_colum'].isna(), 'my_colum'] = series_pred #I assign the predictions using .loc()
#test_2
df['my_colum'] = df['my_colum'].fillna(series_pred) #Double check: I assign the predictions using .fillna()
print(df['my_colum'].shape) #RETURNS (2381,)
print(df['my_colum'].isna().sum()) #RETURN 6
如您所见,它不起作用:缺少的值仍然是6。我随机尝试了一种稍微不同的方法:
#test_3
df[['my_colum']] = df[['my_colum']].fillna(series_pred) #Will it work?
print(df[['my_colum']].shape) #RETURNS (2381, 1)
print(df[['my_colum']].isna().sum()) #RETURNS 6
不起作用。我决定尝试最后一件事:在将结果分配给原始df之前检查fillna结果:
In[42]:
print(df['my_colum'].fillna(series_pred).isna().sum()) #extreme test
Out[42]:
6
所以。。。我非常非常愚蠢的错误在哪里?非常感谢
编辑1
为了显示一点数据
In[1]:
df.head()
Out[1]:
my_column lat long
id
9df Wil 51 5
4f3 Fabio 47 9
x32 Fabio 47 8
z6f Fabio 47 9
a6f Giovanni 47 7
另外,我在问题的开头添加了信息@Ben.T或@Dan应该发布他们自己的答案,他们应该被认为是正确的答案 根据他们的提示,我想说有两种解决方案: 最佳解决方案1:使用loc 问题 当前解决方案的问题是df.loc[df['my_column'].isna,'my_column']期望接收X个值,其中X是缺失值的数量。我的变量预测实际上既有缺失值的预测,也有非缺失值的预测 解决方案 解决方案2:使用fillna 问题 当前解决方案的问题是df['my_column'].fillnaseries_pred要求我的df的索引与series_pred相同,这在这种情况下是不可能的,除非在df中有一个简单的索引,如[0,1,2,3,4…] 解决方案 在代码的最开始处重置df的索引 为什么这不是最好的 最干净的方法是仅在需要时进行预测。使用loc很容易获得这种方法,我不知道如何使用fillna获得它,因为您需要在分类过程中保留索引
编辑:series_pred.index=df['my_column'].isna.index谢谢@Dan你好,费德里科,你能发布你正在使用的数据样本吗?也许表的输出也是如此。序列的行索引是否与df匹配?是否也应该是df.loc[df['my_column'].isna,'my_column']=series_pred[df['my_column'].isna]?还有df和df_x之间的区别是什么?我会重置索引以便它们匹配。。。系列_pred.index=df.index。我猜fillna在索引上匹配,而不是在位置上匹配。@Dan是对的,在fillna中使用序列时,它是索引对齐的。如果您确定数据的大小,那么df.loc[df['my_column'].isna,'my_column']=prediction就可以了,不需要创建序列这不是不可能的,您只需要做series\u pred.index=df['my_column'].isna.index,然后fillna就可以了。但就个人而言,我也会坚持使用切片解决方案。
In[1]:
df.head()
Out[1]:
my_column lat long
id
9df Wil 51 5
4f3 Fabio 47 9
x32 Fabio 47 8
z6f Fabio 47 9
a6f Giovanni 47 7
pred_df = df[df['my_column'].isna()] #For the prediction, use a Dataframe with only the missing values. Problem solved
df_x = pred_df[['lat','long']]
prediction = clf.predict(df_x)
df.loc[df['my_column'].isna(), 'my_column'] = prediction