类型错误:<lambda>() 在使用 apply 后跟 groupby 时获得意外的关键字参数“axis”

Joh*_*dly 5 python pandas pandas-groupby

我试图从 pandas Dataframe 中提取由 ID 分割的值。但是,当我提供 apply groupby 时,它不会让我提供轴参数来按行应用函数

raw_data = {"id":{"0":"mergedshape_route_0009","1":"mergedshape_route_0009","2":"mergedshape_route_0009","3":"mergedshape_route_0009","4":"mergedshape_route_0009","5":"mergedshape_route_0009","6":"mergedshape_route_0009","7":"mergedshape_route_0009","8":"mergedshape_route_0009","9":"mergedshape_route_0009"},"shape_pt_lat":{"0":-6.8196991355,"1":-6.8194035167,"2":-6.8192916609,"3":-6.8192597021,"4":-6.8193262829,"5":-6.819395527,"6":-6.8194451,"7":-6.8192582,"8":-6.8184049,"9":-6.8177623},"shape_pt_lon":{"0":39.2987716198,"1":39.2989432812,"2":39.299055934,"3":39.29918468,"4":39.2993053794,"5":39.2993938923,"6":39.2994472,"7":39.2995691,"8":39.2999065,"9":39.2986298},"shape_pt_sequence":{"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9},"shape_dist_traveled":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0}}

df = pd.DataFrame(raw_data).groupby("id").apply(lambda row: row.shape_pt_lat, axis = 1)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

TypeError                                 Traceback (most recent call last)
~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in apply(self, func, *args, **kwargs)
    917             try:
--> 918                 result = self._python_apply_general(f)
    919             except Exception:

~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in _python_apply_general(self, f)
    935         keys, values, mutated = self.grouper.apply(f, self._selected_obj,
--> 936                                                    self.axis)
    937 

~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in apply(self, f, data, axis)
   2272             group_axes = _get_axes(group)
-> 2273             res = f(group)
   2274             if not _is_indexed_like(res, group_axes):

~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in f(g)
    907                     with np.errstate(all='ignore'):
--> 908                         return func(g, *args, **kwargs)
    909             else:

TypeError: <lambda>() got an unexpected keyword argument 'axis'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-323-9499f329157a> in <module>()
----> 1 df = pd.DataFrame(raw_data).groupby("id").apply(lambda row: row.shape_pt_lat, axis = 1)

~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in apply(self, func, *args, **kwargs)
    928 
    929                 with _group_selection_context(self):
--> 930                     return self._python_apply_general(f)
    931 
    932         return result

~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in _python_apply_general(self, f)
    934     def _python_apply_general(self, f):
    935         keys, values, mutated = self.grouper.apply(f, self._selected_obj,
--> 936                                                    self.axis)
    937 
    938         return self._wrap_applied_output(

~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in apply(self, f, data, axis)
   2271             # group might be modified
   2272             group_axes = _get_axes(group)
-> 2273             res = f(group)
   2274             if not _is_indexed_like(res, group_axes):
   2275                 mutated = True

~\Miniconda3\envs\data_analysis\lib\site-packages\pandas\core\groupby\groupby.py in f(g)
    906                 def f(g):
    907                     with np.errstate(all='ignore'):
--> 908                         return func(g, *args, **kwargs)
    909             else:
    910                 raise ValueError('func must be a callable if args or '

TypeError: <lambda>() got an unexpected keyword argument 'axis'
Run Code Online (Sandbox Code Playgroud)

如果我按 Id 拆分数据帧并将其存储在列表中,然后循环遍历每个数据帧以提取值,我就可以开始工作 - 但我想要一种直接使用 groupby 和 apply 来完成此操作的方法?

这里有任何指导吗?

谢谢!

小智 5

我有类似的错误。我发现GroupBy对象的 apply 函数的行为与 Pandas 的 apply 函数不同DataFrame。有关 GroupBy 对象的 apply 函数的更多信息可以在此处找到。

您在函数中提供的函数apply应该作为dataframe参数。它还返回一个dataframe. 因此,该函数会修改 a dataframe,而您提供的函数会修改一行。

它给出了错误<lambda>() got an unexpected keyword argument 'axis',因为这里的 apply 函数只接受修改数据帧和参数 kwargs 的函数,这些数据帧和参数 kwargs 被馈送到您的函数中。

它尝试向您的 lambda 函数提供 axis 参数(它认为这是您函数的参数),并且由于您的 lambda 函数不需要此参数,因此它显示此错误。

最终的解决方案是将 lambda 函数更改为如上所述的正确函数。