我检查了有关在Python中切片DF的类似问题,但它们没有解释我在练习中看到的不一致之处。
该代码适用于已知的Diamonds数据框。数据框的顶行是:
carat cut color clarity depth table price x y z
0 0.23 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43
1 0.21 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31
2 0.23 Good E VS1 56.9 65.0 327 4.05 4.07 2.31
我必须创建一个包含4个参数的切片函数:DataFrame'df',该DataFrame的列 “ col”,另一个列“ label”的标签以及两个值“ val1”和“ val2”。该函数将获取帧并输出由'label'自变量指示的列的条目,其中'col'列的行大于数字'val1'且小于'val2'。
以下独立代码段为我提供了正确答案:
diamonds.loc[(diamonds.carat > 1.1) & (diamonds.carat < 1.4),['price']]
我从克拉值在1.1到1.4之间的行中获取价格。
但是,当我尝试在函数中使用此语法时,它不起作用并且出现错误。
功能:
def slice2(df,col,output_label,val1,val2):
res = df.loc[(col > val1) & (col < val2), ['output_label']]
return res
函数调用:
slice2(diamonds,diamonds.carat,'price',1.1,1.4)
错误:
"None of [['output_label']] are in the [columns]"
完整的回溯消息:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-64-adc582faf6cc> in <module>()
----> 1 exercise2(test_df,test_df.carat,'price',1.1,1.4)
<ipython-input-63-556b71ba172d> in exercise2(df, col, output_label, val1, val2)
1 def exercise2(df,col,output_label,val1,val2):
----> 2 res = df.loc[(col > val1) & (col < val2), ['output_label']]
3 return res
/Users/jojo/Library/Enthought/Canopy/edm/envs/User/lib/python3.5/site-packages/pandas/core/indexing.py in __getitem__(self, key)
1323 except (KeyError, IndexError):
1324 pass
-> 1325 return self._getitem_tuple(key)
1326 else:
1327 key = com._apply_if_callable(key, self.obj)
/Users/jojo/Library/Enthought/Canopy/edm/envs/User/lib/python3.5/site-packages/pandas/core/indexing.py in _getitem_tuple(self, tup)
839
840 # no multi-index, so validate all of the indexers
--> 841 self._has_valid_tuple(tup)
842
843 # ugly hack for GH #836
/Users/jojo/Library/Enthought/Canopy/edm/envs/User/lib/python3.5/site-packages/pandas/core/indexing.py in _has_valid_tuple(self, key)
187 if i >= self.obj.ndim:
188 raise IndexingError('Too many indexers')
--> 189 if not self._has_valid_type(k, i):
190 raise ValueError("Location based indexing can only have [%s] "
191 "types" % self._valid_types)
/Users/jojo/Library/Enthought/Canopy/edm/envs/User/lib/python3.5/site-packages/pandas/core/indexing.py in _has_valid_type(self, key, axis)
1416
1417 raise KeyError("None of [%s] are in the [%s]" %
-> 1418 (key, self.obj._get_axis_name(axis)))
1419
1420 return True
KeyError: "None of [['output_label']] are in the [columns]"
我在Python方面不是很高级,在看了一段代码后,我一直无法弄清楚问题出在哪里。也许我对这里显而易见的东西视而不见,并且希望对任何指出如何使功能正常工作或如何重做功能以使其产生与单行代码相同的结果的人表示赞赏。
谢谢
答案 0 :(得分:4)
在您的功能中
def slice2(df,col,output_label,val1,val2):
res = df.loc[(col > val1) & (col < val2), ['output_label']]
return res
您正在搜索名称为'output_label'的列,而不使用参数(直接分配其值而不是使用值!)
这应该有效:
def slice2(df,col,output_label,val1,val2):
res = df.loc[(col > val1) & (col < val2), [output_label]] # notice that there are not quotes
return res