首页 > 解决方案 > inplace=False 如何在数据框中不给出 keyerror

问题描述

所以我有一个小小的疑问。当我渲染过滤数据框的交互式下拉列表的最终输出时,我试图删除 3 列。请注意,此下拉列表使用这 3 个已删除列(年、月)中的 2 个进行过滤。因此,我写了df_filter = df_reviews如果在第二次使用交互时再次调用该函数,它将带回这 3 列(需要过滤)。但是,当我使用inplace = True它时,它给了我一个

KeyError                                  Traceback (most recent call last)
~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2645             try:
-> 2646                 return self._engine.get_loc(key)
   2647             except KeyError:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'Year'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
~\anaconda3\lib\site-packages\ipywidgets\widgets\interaction.py in update(self, *args)
    254                     value = widget.get_interact_value()
    255                     self.kwargs[widget._kwarg] = value
--> 256                 self.result = self.f(**self.kwargs)
    257                 show_inline_matplotlib_plots()
    258                 if self.auto_display and self.result is not None:

<ipython-input-88-405b00facead> in filter_dataframe(Year, Month)
     10 
     11         else:
---> 12             df_filter = df_reviews.loc[df_reviews['Year'] == Year]
     13 
     14         if(Month=='All'):

~\anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2798             if self.columns.nlevels > 1:
   2799                 return self._getitem_multilevel(key)
-> 2800             indexer = self.columns.get_loc(key)
   2801             if is_integer(indexer):
   2802                 indexer = [indexer]

~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2646                 return self._engine.get_loc(key)
   2647             except KeyError:
-> 2648                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2649         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
   2650         if indexer.ndim > 1 or indexer.size > 1:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'Year

即使我在做df_filter = df_reviews.(这会带回删除的列)

编码:

def test(Year, Month):
        
        global df_dropdown
        global time_list
        #df_filter = None
        df_filter=df_reviews
        
        if(Year=='All'):
            pass
        
        else:
            df_filter = df_reviews.loc[df_reviews['Year'] == Year]
            
        if(Month=='All'):
            pass  
        
        else:
            df_filter = df_filter.loc[df_filter['Month'] == Month]
            
        df_filter.drop(['Year'], axis = 1, inplace=True)
        df_filter.drop(['Month'], axis = 1, inplace=True)
        df_filter.drop(['Day'], axis = 1, inplace=True)
        
        df_dropdown =  df_filter
        time_list = [Month, Year]
        display(df_filter)
        return time_list

interact(test, Year=['All','2018', '2019', '2020'], Month=['All','January', 'February', 'March', 'April', 'May', 'June', 
                  'July', 'August', 'September', 'October', 'November', 'December'])

但是,当我将其更改为此时,它起作用了:

df_filter = df_filter.drop(['Year'], axis = 1, inplace=False)
df_filter = df_filter.drop(['Month'], axis = 1, inplace=False)
df_filter = df_filter.drop(['Day'], axis = 1, inplace=False)

有人可以解释吗?谢谢!

标签: pandasdataframe

解决方案


发生这种情况是因为当您这样做时

df_filter=df_reviews

它创建对 df_reviews 数据框的引用,这意味着当您删除一列时,它会从原始 df_reviews 数据框中删除该列。

在 df_filter 上执行就地放置后尝试打印 df_reviews,您会注意到这些列将不存在。

df_filter = df_filter.drop(['Year'], axis = 1, inplace=False)

df.drop 返回一个数据框,然后将其分配给 df_filter 从而创建数据的单独副本而不修改 df_reviews。


推荐阅读