如何在Pandas中实现两列除法,除数为0时赋值0?
解决Pandas中新增除法列并处理除数为0的问题
你遇到的ValueError是因为直接用if df[df['pupils']!=0]判断整个DataFrame的布尔值,Pandas无法确定这种情况下的真值(返回的是布尔索引的DataFrame而非单个布尔值)。下面是几种可行的解决方法:
方法1:使用numpy.where向量化处理
这是最直观的向量化实现,逐行判断并赋值:
import numpy as np import pandas as pd # 构造测试数据 df = pd.DataFrame({'apples': [5, 6, 5], 'pupils': [2, 3, 0]}) # 新增目标列 df['avg_apples_per_pupils'] = np.where(df['pupils'] != 0, df['apples'] / df['pupils'], 0.0)
方法2:使用Pandasdiv方法结合值替换
利用除法方法div处理,再替换除0产生的无穷值和空值:
df['avg_apples_per_pupils'] = df['apples'].div(df['pupils']).replace([np.inf, -np.inf], 0.0).fillna(0.0)
解释:div执行除法时,除数为0会生成inf,通过replace将正负无穷值替换为0,fillna处理被除数也为0时产生的NaN。
方法3:使用loc索引分步赋值
先给整列设默认值,再对符合条件的行计算赋值:
# 先初始化整列为0 df['avg_apples_per_pupils'] = 0.0 # 对pupils不为0的行计算除法结果 df.loc[df['pupils'] != 0, 'avg_apples_per_pupils'] = df['apples'] / df['pupils']
以上三种方法都能得到预期结果:
| apples | pupils | avg_apples_per_pupils |
|---|---|---|
| 5 | 2 | 2.5 |
| 6 | 3 | 2.0 |
| 5 | 0 | 0.0 |
内容的提问来源于stack exchange,提问作者Beginner in the house
相关产品推荐
相关产品推荐

