2013-09-22 63 views
1

我有一个数据集,我正在分组,然后尝试删除在特定列中没有数据的任何组。例如:过滤掉所有NaN列的组

df = pd.DataFrame{'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'], 
        'rating': [3., 4., 5., np.nan, np.nan, np.nan], 
        'name': ['John', np.nan, 'Terry', 'Graham', 'Eric', np.nan]} 
g = df.groupby('movie') 

    movie name rating 
0 thg John  3 
1 thg  NaN  4 
2 mol Terry  5 
3 mol Graham  NaN 
4 lob Eric  NaN 
5 lob  NaN  NaN 

我想从数据集中删除组lob,因为没有人评分。我试过

mask = g['rating'].mean().isnull() 
g.filter(~mask) 

它给了我一个错误TypeError: 'Series' object is not callable。这是一种hackish的,所以我也试着

g.filter(lambda group: group.isnull().all()) 

这似乎更Python,但它给我的ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()错误。我如何过滤出一个组,为什么我会得到这些错误?任何关于groupby的其他信息通常也会有所帮助。我使用的是熊猫0.12.0,Python 2.7.5和Mac OS X 10.8.5。

+0

编辑:不要介意不重复,但这可能会有所帮助。 http://stackoverflow.com/questions/13413590/how-to-drop-rows-of-pandas-dataframe-whose-value-of-certain-column-is-nan – Shashank

回答

0

如果你要过滤的组,你可以这样做:

g = df.groupby('movie').count() 
g = g[g['rating']>0] 

Out[14]: 
      movie name rating 
    movie   
    mol  2 2 1 
    thg  2 1 2 

或者你可以过滤DF先组

g = df[df['rating'].notnull()].groupby('movie').count() 

这将影响到最终的收视率:

Out[15]: 
     movie name rating 
movie   
mol  1 1 1 
thg  2 1 2 

所以mol有一个较低的电影和名称计数与上述相比,但评分是相同的

+0

不幸的是,这只是过滤掉所有记录NaN评级。我想过滤掉只有NaN评级的所有群组。如果一个团体甚至有一个非NaN评级,我想保留整个团队。 (并且最终将这些意思归咎于这些NaN值。) –

+0

删除NaN的顶级代码意味着该组不会出现在组中,这与您想要的有何不同?或者你是否想要保持小组的总数,以便可以将这个意思进行归纳? – EdChum

+0

@TimLewandowski重新阅读您的评论后,我不明白为什么第二个代码片段不会做你想做的事情,因为你将过滤掉所有有NaN评级的行。所以只要你对电影有一个评级,那么它将在groupby操作中发挥作用。 – EdChum