我有一个数据框,其中有一列我想要按组分组。在每组内,我想进行一个检查,看看第一个值是否小于第二个值乘以某个标量,例如(x < y * .5)。如果是,则将第一个值设置为True,所有其他值都为False。否则,所有值都为False。
我这里有一个示例数据框:
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')
这导致分成三个组,每组有两个条目。通过添加
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个元素的情况。
有两个问题:
是否可能保留原始数据框中的索引并更新一列以显示groupby的结果?这因为
.nsmallest
调用在“c”列上生成了 series,所以有所不同。是否存在更优雅的方法来计算基于自定义条件(例如此比率测试)的数据框中的组的布尔数组?