Pandas 0.13.1 中使用 groupby() 结合 drop_duplicates() 或 dropna()
我刚刚把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'])