pandas - 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)
有人可以解释吗?谢谢!
解决方案
发生这种情况是因为当您这样做时
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。
推荐阅读
- java - 在 Java 的 ArrayList 中存储值的“元组”
- linux - 如何使用 MAKEFILE 将环境变量从 shell 脚本导出到当前 shell 实例
- javascript - 如何在使用引导选项卡从另一个页面导航时打开特定的
- python - 使用正则表达式python捕获字符串中的整数列表
- swift - Overlapping text in uicollection view headers for different sections
- python - 为什么 python 将这两个变量存储在同一位置?
- node.js - 无法在颤动中使用 dio 将图像上传到 api
- java - Java 字符串请求参数忽略 #
- git - Git将合并文件之间的差异显示为整个文件,而两者的行尾都有CRLF
- python - 确定两个字符串是否最多相差 n 个字符