Python:为 groupby 值生成值范围

问题描述 投票:0回答:1

我正在尝试使用 python 生成测试数据。让我知道我是否能实现这样的目标。 我将输入一个数字,比如 20,我需要生成 20 个行值。一列包含每个组的值范围。应在该范围内生成值。 (有些没有值范围,可以跳过)下面的示例输入和预期输出。

输入示例:

VarName        Label             Score

LtoV           0.00<=to>=0.68     20

LtoV           0.69<=to>=2        33

LtoV           2toHigh            40

Age           0to20               36

Age           21to40              15

Age           41to60              50
  

输出:

当我将值指定为 20 时,我需要为 LtoV 生成 20 行,其中第 2 列具有 0.00 到高之间的任何值,并且应根据该值给出相应的分数。年龄也为 20 行。

SNo    VarName    column2      Score
    
1    LtoV       0.00        20     
2    LtoV       0.42        20
3    LtoV        1          33
4    LtoV        2.5        40
    
20   LtoV         50        40

生成 20 个这样的 LtoV 值和 20 个这样的年龄值,并基于范围对应的分数值。 这可行吗?


python pandas range row
1个回答
0
投票

您可以提取范围的下限/上限,如果缺少,则可以选择设置默认低/高(否则

dropna
)。然后使用
sample
每组 20 行,并使用
replace=True
 以矢量方式生成随机值:
numpy.random.uniform

输出示例:

df = pd.DataFrame({'VarName': ['LtoV', 'LtoV', 'LtoV', 'Age', 'Age', 'Age'], 'Label': ['0.00<=to>=0.68', '0.69<=to>=2', '2toHigh', '0to20', '21to40', '41to60'], 'Score': [20, 33, 40, 36, 15, 50]}) ranges = (df['Label'] .str.extract(r'^(\d+\.?\d*)?\D+(\d+\.?\d*)?$') .astype(float) .fillna({0: 0, 1: 100}) # default low/high .groupby(df['VarName']).sample(n=20, replace=True) ) low, high = ranges.to_numpy().T out = (df.reindex(ranges.index) .assign(column2=np.random.uniform(low, high)) .sort_index() )

中级:

VarName Label Score column2 0 LtoV 0.00<=to>=0.68 20 0.670814 0 LtoV 0.00<=to>=0.68 20 0.222490 0 LtoV 0.00<=to>=0.68 20 0.364282 0 LtoV 0.00<=to>=0.68 20 0.607478 0 LtoV 0.00<=to>=0.68 20 0.633055 0 LtoV 0.00<=to>=0.68 20 0.675987 0 LtoV 0.00<=to>=0.68 20 0.531158 1 LtoV 0.69<=to>=2 33 1.843399 1 LtoV 0.69<=to>=2 33 1.940886 1 LtoV 0.69<=to>=2 33 1.760578 1 LtoV 0.69<=to>=2 33 1.110946 1 LtoV 0.69<=to>=2 33 1.724802 2 LtoV 2toHigh 40 19.508126 2 LtoV 2toHigh 40 43.618950 2 LtoV 2toHigh 40 62.808270 2 LtoV 2toHigh 40 95.246445 2 LtoV 2toHigh 40 2.536909 2 LtoV 2toHigh 40 29.841093 2 LtoV 2toHigh 40 73.958545 2 LtoV 2toHigh 40 89.782031 3 Age 0to20 36 12.593195 3 Age 0to20 36 0.110518 3 Age 0to20 36 5.308487 3 Age 0to20 36 12.914926 3 Age 0to20 36 17.198194 3 Age 0to20 36 17.529561 3 Age 0to20 36 0.954200 4 Age 21to40 15 28.722856 4 Age 21to40 15 30.446264 4 Age 21to40 15 26.812708 4 Age 21to40 15 34.001827 4 Age 21to40 15 30.052331 4 Age 21to40 15 28.470239 4 Age 21to40 15 30.371726 5 Age 41to60 50 50.095150 5 Age 41to60 50 57.618241 5 Age 41to60 50 56.214911 5 Age 41to60 50 58.106158 5 Age 41to60 50 41.220661 5 Age 41to60 50 49.831084

© www.soinside.com 2019 - 2024. All rights reserved.