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

Python pandas按某列计数从另一DataFrame列随机抽样求和方法

pandas按指定次数抽样求和实现方案

前置依赖

首先确保你已经安装了pandas和numpy,没有的话先在终端执行安装命令:
pip install pandas numpy

完整可运行代码

import pandas as pd
import numpy as np

# 1. 构造两个测试DataFrame,和你给出的结构一致
df1 = pd.DataFrame({
    'Year': [1, 2, 3, 4, 5],
    'Count': [3, 2, 1, 5, 4]
})

df2 = pd.DataFrame({
    'ID': [1, 2, 3, 4, 5],
    'Value': [100, 50, 0, 25, 50]
})

# 2. 提前提取抽样池,避免重复取数
value_pool = df2['Value']

# 可选:固定随机种子,方便调试复现结果,不需要可以删除
np.random.seed(42)

# 3. 逐行按Count值抽样求和,生成RandSum列
df1['RandSum'] = df1['Count'].apply(
    lambda n: value_pool.sample(n=n, replace=False).sum()
)

# 打印查看结果
print(df1)

代码说明

  • 核心用pandas自带的sample()方法做抽样,不需要自己写复杂的随机逻辑
  • sample()常用参数说明:
    • n:代表抽样数量,这里直接传入当前行的Count值即可
    • replace=False:无放回抽样,即同一个值不会被重复抽取,适合Count值不超过抽样池总长度的场景;如果后续你的Count值可能大于Value列的总长度,把参数改成replace=True即可开启有放回抽样,允许重复抽取同一个值
  • 注意:因为是随机抽样,每次运行得到的RandSum值会有差异,你给出的预期结果只是其中一种随机情况;只有当Count值等于抽样池总长度时,无放回抽样的结果是固定的(即所有Value的总和225),和你示例中第四行的结果完全一致

入门易读版:普通循环实现

如果你对apply方法不熟悉,可以用最直白的逐行遍历写法,逻辑完全一致:

value_pool = df2['Value']
# 先初始化RandSum列
df1['RandSum'] = 0

# 逐行遍历df1
for idx, row in df1.iterrows():
    # 获取当前行需要的抽样次数
    sample_n = row['Count']
    # 抽样、求和
    sum_res = value_pool.sample(n=sample_n, replace=False).sum()
    # 赋值到对应位置
    df1.loc[idx, 'RandSum'] = sum_res

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:24:18