熊猫集团指数

时间:2016-02-28 05:01:29

标签: python pandas

我有一个数据框,其中包含我想要分组的列。在每个组中,我想执行检查以查看第一个值是否小于第二个值乘以某个标量,例如(x

我这里有一个示例数据框:

d = pd.DataFrame(np.array([[0, 0, 1, 1, 2, 2, 2],
                           [3, 4, 5, 6, 7, 8, 9],
                           [1.25, 10.1, 2.3, 2.4, 1.2, 5.5, 5.7]]).T,
                          columns=['a', 'b', 'c'])

我可以获得一个堆叠的组来获取我想要的数据a

g = d.groupby('a')['c'].nsmallest(2).groupby(level='a')

这导致三组,每组有2个条目。通过添加apply,我可以调用一个函数来返回一个布尔掩码:

def func(group):
    if group.iloc[0] < group.iloc[1] * .5:
        return [True, False]
    else:
        return [False, False]

g = d.groupby('a')['c'].nsmallest(2).groupby(level='a').apply(func)

不幸的是,这会将索引销毁到原始数据框中,并且无法处理存在2个以上元素的情况。

两个问题:

  1. 是否可以在原始数据框中维护索引并使用groupby的结果更新列?这有点略有不同,因为.nsmallest通话会在&#39; c&#39;列。

  2. 根据某些自定义条件,为数据框中的组计算布尔数组是否存在更优雅的方法,例如:这个比率测试。

1 个答案:

答案 0 :(得分:2)

看起来transform就是您所需要的:

>>> def func(group):
...     res = [False] * len(group)
...     if group.iloc[0] < group.iloc[1] * .5:
...         res[0] = True
...     return res
>>> d['res'] = d.groupby('a')['c'].transform(func).astype('bool')
>>> d
   a  b      c    res
0  0  3   1.25   True
1  0  4  10.10  False
2  1  5   2.30  False
3  1  6   2.40  False
4  2  7   1.20   True
5  2  8   5.50  False
6  2  9   5.70  False

来自文档:

  

transform方法返回一个索引相同的对象(相同   大小)作为被分组的那个。这样,传递的变换函数   应返回与组块大小相同的结果。对于   例如,假设我们希望标准化每个组内的数据