Pandas 0.13.1 中使用 groupby() 结合 drop_duplicates() 或 dropna()

1 投票
2 回答
5361 浏览
提问于 2025-04-18 03:59

我刚刚把Pandas从之前的版本更新到了0.13.1,开心的是,这让我有了一些新的选择。不过不开心的是,这似乎导致我的一些数据处理代码出现了问题。我除了更新Pandas版本从0.11.0到0.13.1,其他地方没有做任何改动。

之前能正常工作的代码,现在却不行了,代码如下:

g_pres = g_pres.groupby(['follow','Focal','std_epoch']).dropna(0)

或者

g_pres = g_pres.groupby(['follow','Focal','std_epoch']).drop_duplicates(0)

使用这两种方式都会出现以下的属性错误:

 ---------------------------------------------------------------------------
 AttributeError                            Traceback (most recent call last)
 <ipython-input-169-5d3c7458da40> in <module>()
 ----> 1 g_pres = g_pres.groupby(['follow','Focal','std_epoch']).dropna(0)

 //anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in __getattr__(self, attr)
     293 
     294         if hasattr(self.obj, attr) and attr != '_cache':
     --> 295             return self._make_wrapper(attr)
     296 
     297         raise AttributeError("%r object has no attribute %r" %

//anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in _make_wrapper(self, name)
    308                    "using the 'apply' method".format(kind, name,
    309                                                      type(self).__name__))
--> 310             raise AttributeError(msg)
    311 
    312         f = getattr(self.obj, name)

AttributeError: Cannot access callable attribute 'dropna' of 'DataFrameGroupBy' objects,         try using the 'apply' method

我查看了更新说明,搜索了groupby、drop_duplicates和drop_na,但找不到任何能说明(至少对我来说)是什么导致这个变化的内容。我是个初学者,可能有些东西我没注意到。

drop_duplicates这个函数现在不再适用于groupby的数据框了吗?有没有新的语法?……这是个新功能还是个bug?

我想也许是因为新增了inplace这个方法,所以我需要指定一些之前是默认的东西,但查看相关方法的文档并没有让我有任何进展。

[编辑以添加示例数据]

示例输入:

      follow     std_epoch     Focal     0
 0    1          1             53704     51602
 1    1          1             53704     51602
 2    1          2             53704     51602
 3    2          1             53505     51509     
 4    2          2             53505     51509

示例输出,我想按follow、std_epoch和Focal分组,并从第'0'列中去掉重复值(在这个例子中,就是输入的第2行)。

      follow     std_epoch     Focal     0
 0    1          1             53704     51602
 1    1          2             53704     51602
 2    2          1             53505     51509     
 3    2          2             53505     51509

2 个回答

0

为了对一个分组后的数据表(DataFrame)应用某个方法,你需要使用一个循环,像下面这样:

display = IPython.display.display

g_pres = g_pres.groupby(['follow','Focal','std_epoch'])

for a,b in g_pres:
    z = b.dropna(0)
    display(z)
0

解决方案:基本上,就是重新考虑这个问题。正如我在评论中提到的,我并不需要使用groupby来去掉重复项,我只需要把它们放在我之前代码的同一行就可以了。我仍然不太明白为什么这样会产生错误,而之前却没有(也许它本来就应该总是报错,不过之前确实得到了我想要的结果!)。不过,现在我只需用两行代码来完成这个操作。

去掉重复项的方法:

 df = df.drop_duplicates()

创建分组对象的方法:

df = df.groupby(['column1','column2'])

撰写回答