You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按数值区间为DataFrame列值匹配乘数进行乘法运算

解决方案

针对你的需求,无需写大量多条件索引,用Pandas和NumPy的向量化操作就能高效实现,推荐两种实用方法:

方法一:使用pd.cut(直观易读)

通过pd.cut将数值映射到对应区间,匹配乘数后完成乘法,适合需要清晰区间定义的场景:

import numpy as np
import pandas as pd

# 生成测试DataFrame
df = pd.DataFrame(np.random.randint(0,100,size=(100000, 4)), columns=list('ABCD'))

# 定义区间(左闭右开,最后一个区间包含所有大于90的数值)
bins = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, np.inf]
# 对应每个区间的乘数,顺序与bins一一对应
multipliers = [3.2, 1.4, 5.6, 3.2, 1.9, 3.7, 1.1, 3.3, 1, 4]

# 将所有数值按区间分组,获取对应乘数的索引并映射
stacked_multipliers = pd.cut(df.stack(), bins=bins, labels=False).map(dict(enumerate(multipliers)))
# 恢复原DataFrame形状并执行乘法
result_df = df.mul(stacked_multipliers.unstack())

方法二:使用np.digitize(大数据量更高效)

基于NumPy的向量化操作,底层为C实现,处理10万行这类数据时性能更优:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0,100,size=(100000, 4)), columns=list('ABCD'))

# 定义区间分界点(np.digitize默认左开右闭,分界点对应区间的右边界)
bins = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# 对应每个区间的乘数:索引0对应<=10的数值,索引1对应(10,20],最后一个索引对应>90的数值
multipliers = [3.2, 1.4, 5.6, 3.2, 1.9, 3.7, 1.1, 3.3, 1, 4]

# 获取每个数值对应的乘数索引
indices = np.digitize(df, bins)
# 按索引取乘数并执行元素级乘法
result_df = df * np.array(multipliers)[indices]

注意事项

  • 区间边界调整:如果需要修改数值归属(比如让10属于0-10区间),只需调整bins定义,例如改为[-np.inf, 10, 20, ...],同时对应调整乘数顺序即可。
  • 性能选择:np.digitize在处理超大DataFrame时,速度明显优于pd.cut,更适配你的10万行数据场景。

内容的提问来源于stack exchange,提问作者Aristocrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:30:26