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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:32