Python 筛选出具有所有NaN列的组

Python 筛选出具有所有NaN列的组,python,pandas,Python,Pandas,我有一个正在分组的数据集,然后尝试删除在特定列中没有数据的任何组。例如: 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

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

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”对象不可调用。这有点老套,所以我也试过了

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

这看起来更像python,但它给了我一个ValueError的错误:包含多个元素的数组的真值是不明确的。使用a.any或a.all。如何筛选出一个组,为什么会出现这些错误?关于groupby的任何附加信息通常也会有所帮助。我使用的是pandas 0.12.0、Python 2.7.5和Mac OS X 10.8.5。

如果要筛选组,可以执行以下操作:

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的电影和名字数量比上面的要少,但评级是一样的

EDIT:不要介意重复,但这可能会有所帮助。不幸的是,这只是过滤掉了所有具有NaN评级的记录。我想筛选出所有只有NaN评级的组。如果一个组有一个非NaN评级,我想保留整个组。并最终将平均值填入这些NaN值。删除NaN的顶级代码意味着组不会出现在组中,这与您想要的有什么不同?或者你想保留组的总计数,以便计算平均数?@Timlwandowski在重新阅读你的评论后,我不明白为什么第二个代码段没有达到你想要的效果,因为你将过滤掉所有具有NaN评级的行。因此,只要你对一部电影有一个评级,那么它就会出现在groupby操作中。删除没有任何评级的组后,我希望能够用每个组的平均评级填充NaN评级。然而,我需要至少有一个评级才能做到这一点。所以我想要一些可以删除lob组的东西,但保留mol和thg组的所有记录。@Timlwandowski第一个代码段将保留所有记录,即使是那些至少有一个评级的组,也会保留NaN的记录,然后你可以根据这一点计算评级的平均值吗?