使用全NaN列过滤掉组

时间:2013-09-22 22:07:50

标签: 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]}
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())

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

1 个答案:

答案 0 :(得分: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的电影和名称数量较少,但评级相同