python - 在 groupby 之后基于条件数据帧应用函数
问题描述
我想在 groupby 之后对一组数字执行一个函数,但是这个函数只有在满足某个条件时才有效。有没有办法执行两种不同的操作?
假设我们想在 groupby 之后应用函数 1/x。对于 x==0 当然不能这样做,但我们只想得到 0 作为返回值。通常,这看起来像这样
if x > 0: return 1/x else: return 0
然而,做
df.groupby(by = ["index"]).apply(lambda x: 0 if x == 0 else 1/x)
给我一个错误信息:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
。
构建的数据如下:
在 groupby 之后,我只剩下
df = | 索引| 值1| | --- | -----| | 一个 |0 | | 乙 | 0.5| | c | 0.2|,索引不再可调用。
我也有数据集
dg =
指数 | 价值2 | 价值3 |
---|---|---|
一种 | 1 | 5 |
一种 | 2 | 8 |
C | 3 | 7 |
C | 7 | 7 |
b | 5 | 6 |
b | 7 | 13 |
我加入索引使用
dh = pd.merge(dg, df, how = 'left', on = index)`。
现在我想应用该功能
dh.groupby(by=index).apply(lambda x: (((x.value2/x.value3) - x.value1)**2).sum() / (x.value1 * (x.n.count()))
,
当 value1 等于 0 时显然不能执行。如前所述放入条件会给我上述错误。我该怎么办?
解决方案
您可以创建一个为您执行此操作的函数:-
def func(x):
if x['value1'].gt(0).all():
return 1/x['value1']
else:
return ((((x['value2']/x['value3'])-x['value1'])**2).sum()/x['value1']*x['value1'].count())
现在只需使用:-
dh.groupby(by = ["index"]).apply(func)
输出:-
index
a 0 inf
1 inf
b 4 2.0
5 2.0
c 2 5.0
3 5.0
推荐阅读
- cypress - 赛普拉斯在 cy.request 上自动发送 cookie
- javascript - 制表符:已编辑的单元格未显示在 table.getEditedCells() 中
- c# - Unity中的W、A、S、D运动,不知道新功能怎么用
- reactjs - Reactjs函数不返回JSX
- odoo - Odoo api.depends 和非存储字段
- python - odoo 用于更新的默认更改密码表单的参数/字段
- autodesk-forge - 使用 API 创建 Forge 应用程序的可能性
- r - R矩阵行名
- python - 如何使用 Python 获取最前面的 Windows 资源管理器窗口的目录路径?
- flutter - 根据 GPS 距离对列表项进行排序