python - 如何通过使用 pandas 定义除法函数来获得结果?
问题描述
def set_div(a,b):
if a==0:
if b==0:
return 0
else:
return 10**6
else:
return b/a
东风:
a b
0 0.0 0.0
1 30000.0 0.0
2 0.0 0.0
3 32700.0 10000.0
4 51700.0 0.0
col a 和 b 的 dtypes 是float64
.
df['c'] = df[['a','b']].apply(lambda x:set_div(x[0],x[1]))
但它返回KeyError: (0, 'occurred at index a')
。
我不明白错误,请解释以及如何获得我的结果。
解决方案
如果想使用为每一行工作的自定义函数DataFrame.apply
需要axis=1
:
df['c'] = df.apply(lambda x :set_div(x['a'],x['b']), axis=1)
另一个解决方案numpy.select
是矢量化,因此在大型 DataFrame 中性能更好:
m1 = df['a'] == 0
m2 = df['b'] == 0
df['c'] = np.select([m1 & ~m2, m1 & m2], [10**6, 0], df['b'] / df['a'])
print (df)
a b c
0 0.0 0.0 0.00000
1 30000.0 0.0 0.00000
2 0.0 0.0 0.00000
3 32700.0 10000.0 0.30581
4 51700.0 0.0 0.00000
性能:
#[50000 rows x 2 columns]
df = pd.concat([df] * 10000, ignore_index=True)
In [113]: %timeit df['c'] = np.select([m1 & ~m2, m1 & m2], [10**6, 0], df['b'] / df['a'])
1.85 ms ± 32.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [114]: %timeit df['c1'] = df.apply(lambda x :set_div(x['a'],x['b']), axis=1)
1.01 s ± 17.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
推荐阅读
- azure - 在 AKS 虚拟节点上运行 Azure Functions 的性能
- docker - 从 docker 容器连接到 ubuntu 端口
- docker - 运行 docker-compose up 时可以附加到集群中的单个容器吗?
- git - Git状态:显示模式(权限)更改
- c++ - 升级Qt5.4.1到5.12.1,现在QCodec给出异常
- sql - SQL 违反 UNIQUE KEY 约束但条目不存在?
- c++ - 为什么未使用的成员模板函数的类模板实例化失败
- php - PHPMailer 添加附件
- fiware - 组织的 DELETE 请求不需要身份验证令牌
- python - 3D matplotlib 中闪闪发光的 blob