Python数据框切片功能无法使用,但可以独立运行

时间:2019-10-15 13:51:55

标签: python pandas dataframe slice

我检查了有关在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方面不是很高级,在看了一段代码后,我一直无法弄清楚问题出在哪里。也许我对这里显而易见的东西视而不见,并且希望对任何指出如何使功能正常工作或如何重做功能以使其产生与单行代码相同的结果的人表示赞赏。

谢谢

1 个答案:

答案 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