如何基于Pandas DataFrame的Climate列值对eta列做随机倍数乘法
按气候条件为Pandas DataFrame的eta列乘以对应范围随机数
原代码的问题
你写的代码存在几个核心错误:
- 列索引逻辑错误:
'eta' * random.uniform(1.0, 1.2)是将字符串'eta'重复多次,而非对eta列的数值执行乘法操作 - 条件匹配错误:需求中气候值是
'Rainny',但代码里写的是'Rain' - 随机数生成逻辑错误:
random.uniform仅生成单个随机值,无法为每行生成独立的随机乘数
正确实现方式
以下两种方法均可满足需求,根据数据量选择即可:
方法1:逐行处理(适合小数据集)
使用apply函数,根据每行的Climate值生成对应范围的随机数,再与eta相乘:
import pandas as pd import random # 示例数据 df = pd.DataFrame({ 'Climate': ['Sunny', 'Rainny', 'Cloudy', 'Sunny', 'Rainny'], 'eta': [10, 20, 30, 40, 50] }) def adjust_eta(row): match row['Climate']: case 'Sunny': return row['eta'] * random.uniform(0.8, 1.0) case 'Rainny': return row['eta'] * random.uniform(1.0, 1.2) case 'Cloudy': return row['eta'] * random.uniform(0.9, 1.1) case _: return row['eta'] # 未匹配气候时返回原值 df['eta'] = df.apply(adjust_eta, axis=1)
方法2:向量化操作(适合大数据集)
利用numpy的向量化生成随机数,性能远高于逐行处理:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({ 'Climate': ['Sunny', 'Rainny', 'Cloudy', 'Sunny', 'Rainny'], 'eta': [10, 20, 30, 40, 50] }) # 初始化乘数数组为1(默认不修改值) multipliers = np.ones(len(df)) # 为不同气候生成对应范围的随机乘数 sunny_mask = df['Climate'] == 'Sunny' multipliers[sunny_mask] = np.random.uniform(0.8, 1.0, size=sunny_mask.sum()) rainny_mask = df['Climate'] == 'Rainny' multipliers[rainny_mask] = np.random.uniform(1.0, 1.2, size=rainny_mask.sum()) cloudy_mask = df['Climate'] == 'Cloudy' multipliers[cloudy_mask] = np.random.uniform(0.9, 1.1, size=cloudy_mask.sum()) # 更新eta列 df['eta'] *= multipliers
额外提示
- 若需要可复现的随机结果,可在生成随机数前设置种子:
random.seed(42)(方法1)或np.random.seed(42)(方法2) - 方法2的向量化操作在处理十万级以上数据时,速度会比
apply快数倍
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

