按数值区间为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
相关产品推荐
相关产品推荐

