有没有一种简洁的方法来删除GroupBy对象的每个组中的行?

时间:2018-11-14 23:45:34

标签: python pandas dataframe

请考虑以下与Pandas' Group By Tutorial非常相似的数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Week' : [1, 2, 1, 2,
                                 1, 2, 1, 1],
                           'BloodType' : ['A+', 'AB', 'AB', 'B',
                                  'B', 'B+', 'AB', 'AB'],
                           'C' : np.random.randn(8),
                           'D' : np.random.randn(8)})

这将产生一个DataFrame,如下所示:

Sample Data

我想按"Week"分组,然后仅对列CD进行一些操作。所以我尝试了:

week_group = df.groupby('Week')
week_group.apply(lambda x: x.drop(["BloodType", "Week"], 1))

最初,我解释为DataFrame"BloodType"列中的每"Week"滴,然后将结果分组给我。但是,它给了我

Sample apply

但是,我希望它能给我一个Group,其中每个索引都是一个DataFrame,只有列CD。我没想到有DataFrame

我尝试用applytransform淘汰agg,这给出了:

ValueError: transform must return a scalar value for each group

和:

ValueError: cannot copy sequence with size 2 to array axis with dimension 5

分别。是否有一个相对简单的转换,可以按名称DataFrame中的每个Group删除行,并返回生成的Group对象(或就地执行操作)?

2 个答案:

答案 0 :(得分:2)

基于CJ59的回答,我想到了这个简洁的解决方案:

week_group = week_group[df.columns.difference(["Week", "BloodType"])]

答案 1 :(得分:0)

您可能正在搜索

for name, group in df.groupby('Week'):
    print(name, group.drop(columns=['Week', 'BloodType']))

1           C         D
0  0.496714 -0.469474
2  0.647689 -0.463418
4 -0.234153  0.241962
6  1.579213 -1.724918
7  0.767435 -0.562288
2           C        D
1 -0.138264  0.54256
3  1.523030 -0.46573
5 -0.234137 -1.91328