尝试在Python中使用Panda的'loc'函数估算缺失值时出错

时间:2018-08-01 06:46:24

标签: python pandas machine-learning

我试图使用Panda库的'loc'函数在数据集中的某一列中插入缺失值,但是代码未成功执行。代码行如下。

# Impute missing data by mean weight of each sub-category in 'Item_Weight' column

data.loc[miss_bool,'Item_Weight'] = data.loc[miss_bool,'Item_Identifier'].apply(lambda x: item_avg_weight[x])

正在生成的错误如下,

data.loc[miss_bool,'Item_Weight'] = data.loc[miss_bool,'Item_Identifier'].apply(lambda x: item_avg_weight[x])
Traceback (most recent call last):

  File "<ipython-input-3-168be6231060>", line 1, in <module>
    data.loc[miss_bool,'Item_Weight'] = data.loc[miss_bool,'Item_Identifier'].apply(lambda x: item_avg_weight[x])

  File "C:\Users\Arnab\Anaconda3\lib\site-packages\pandas\core\series.py", line 3192, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)

  File "pandas/_libs/src\inference.pyx", line 1472, in pandas._libs.lib.map_infer

  File "<ipython-input-3-168be6231060>", line 1, in <lambda>
    data.loc[miss_bool,'Item_Weight'] = data.loc[miss_bool,'Item_Identifier'].apply(lambda x: item_avg_weight[x])

  File "C:\Users\Arnab\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2685, in __getitem__
    return self._getitem_column(key)

  File "C:\Users\Arnab\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2692, in _getitem_column
    return self._get_item_cache(key)

  File "C:\Users\Arnab\Anaconda3\lib\site-packages\pandas\core\generic.py", line 2486, in _get_item_cache
    values = self._data.get(item)

  File "C:\Users\Arnab\Anaconda3\lib\site-packages\pandas\core\internals.py", line 4115, in get
    loc = self.items.get_loc(item)

  File "C:\Users\Arnab\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 3065, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))

  File "pandas\_libs\index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc

  File "pandas\_libs\index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc

  File "pandas\_libs\hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item

  File "pandas\_libs\hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item

KeyError: 'FDP10'

我观察到错误跟踪的最后一行显示'KeyError:'FDP10'

FDP10 正是'Item_Identifier'列中的第一个值,'Item_Weight'列中的相应单元格为空白( aka缺少值)。

因此,似乎该代码命中了第一个空白列,它无法用替换值替换该空白列。

我找到的另一个代码是

data.loc[miss_bool,'Item_Weight'] = data.loc[miss_bool,'Item_Identifier'].apply(lambda x: item_avg_weight.at[x,'Item_Weight'])

这个替代代码背后的逻辑在我看来也很合理。但是我的问题是原始代码有什么问题?

如果您需要其他任何信息,请与我联系!

2 个答案:

答案 0 :(得分:0)

在进行分析时,发现火车数据集中有4个产品的缺失值占一行,因此可能的解决方案是引用包含4个缺失产品的项目权重的测试数据集。

答案 1 :(得分:0)

这与使用pivot_table有关

去:

item_avg_weight = df.groupby('Item_Identifier').mean()['Item_Weight']

代替:

item_avg_weight = df.pivot_table(values='Item_Weight', index='Item_Identifier')

因此,您不必使用at函数,然后只需编写:

df.loc[miss_bool,'Item_Weight'] = df.loc[miss_bool,'Item_Identifier'].apply(lambda x: item_avg_weight[x])