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
相关产品推荐
相关产品推荐

