Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python fillna()和loc()的赋值显然不起作用_Python_Pandas_Numpy_Supervised Learning_Fillna - Fatal编程技术网

Python fillna()和loc()的赋值显然不起作用

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

我到处寻找答案,但找不到

我的目标是:我尝试在数据帧中填充一些缺失的值,使用监督学习来决定如何填充它

我的代码如下所示:注意——第一部分并不重要,它只是提供上下文

到目前为止,一切顺利。我有我的2381个预测,我只需要其中的几个,里面没有NaN值,为什么预测中会有NaN值?我只是想确定一下,因为我不明白我的错误

在这里,我尝试将预测分配给我的数据帧:

#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