我正在尝试使用 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 个这样的年龄值,并基于范围对应的分数值。 这可行吗?
您可以提取范围的下限/上限,如果缺少,则可以选择设置默认低/高(否则
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