【问题标题】:Error while trying to impute missing values using Panda's 'loc' functionin Python尝试在 Python 中使用 Pandas 'loc' 函数估算缺失值时出错
【发布时间】:2018-08-01 06:46:23
【问题描述】:

我正在尝试使用 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'])

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

如果您需要任何其他信息,请告诉我,我会提供相同的信息!

【问题讨论】:

  • 你检查你的miss_bool数组的内容了吗?因为它可能包含那个 'FDP10' 值
  • @m33n miss_bool 数组(我宁愿说向量,因为它只有一列)包含真假数据。对于原始数据集文件“data”中的每个条目,如果记录行在其“Item_Weight”列中缺少值,则在 miss_bool 向量中,对应于该索引的行具有“true”值,否则为“false”。我希望这会有所帮助! :)

标签: python pandas machine-learning


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这与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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      相关资源
      最近更新 更多