随机分组

时间:2018-12-12 15:24:27

标签: python pandas numpy

我有一个下面的DataFrame:

我正在尝试填充支出系列中的值,作为SanctionedAmount的10%到20%之间的任何随机值。此逻辑需要应用于每组帐户ID。

Index  accountid  transdate  SanctionedAmount  balance  disbursedamount

0        103602 2018-08-01              7806     6798                0
1        103602 2018-11-01              7806     6798                0
2        103606 2018-11-01              6274     7313                0
3        103606 2018-06-01              6274     7313                0
4        103606 2018-07-01              6274     7313                0
5        103606 2018-08-01              6274     7313                0
6        103609 2018-11-01              5726     8189                0
7        103609 2018-07-01              5726     8189                0
8        103609 2018-08-01              5726     8189                0
9        103609 2018-06-01              5726     8189                0
10       103617 2018-07-01              6549     7457                0
11       103634 2018-06-01              8835     7794                0
12       103637 2018-07-01              6920     6623                0
13       103644 2018-06-01              8481     8253                0
14       103645 2018-11-01              8220     9966                0
15       103645 2018-06-01              8220     9966                0
16       103645 2018-07-01              8220     9966                0
17       103645 2018-08-01              8220     9966                0

预期输出:

Index accountid transdate  SanctionedAmount  balance disbursedamount

0   103602     2018-08-01     1000            798      100
1   103602     2018-11-01     1000            798      200
2   103606     2018-11-01     2000            313      200
3   103606     2018-06-01     2000            313      400
4   103606     2018-07-01     2000            313      200
5   103606     2018-08-01     2000            313      300
6   103609     2018-11-01     5000            189      500
7   103609     2018-07-01     5000            189      1000
8   103609     2018-08-01     5000            189      700
9   103609     2018-06-01     5000            189      800
10  103617     2018-07-01     3000            457      600
11  103634     2018-06-01     4000            794      700

5 个答案:

答案 0 :(得分:2)

您可以将SanctionedAmount乘以从0.1到0.2之间的均匀分布的随机选择的数字。

df['disbursedamount'] = df['SanctionedAmount'] * np.random.uniform(0.10, 0.20)

答案 1 :(得分:0)

for i in locaccntrandom.index:
    locaccntrandom.loc[i,'disbursedamount']=((random.randint(10,15)* locaccntrandom.loc[i,'SanctionedAmount'])/100)

我为此使用了循环,并能够获取值。

谢谢!

答案 2 :(得分:0)

您可以将df.apply()np.random.randint()一起使用:

df['disbursedamount'] = df.apply(lambda x: np.random.randint(0.1*x['SanctionedAmount'], 0.2*x['SanctionedAmount']), axis=1)

使用np.random.seed(0),可以得到:

       accountid   transdate  SanctionedAmount  balance  disbursedamount
Index                                                                   
0         103602  2018-08-01              7806     6798             1464
1         103602  2018-11-01              7806     6798             1339
2         103606  2018-11-01              6274     7313              819
3         103606  2018-06-01              6274     7313              986
4         103606  2018-07-01              6274     7313              636
5         103606  2018-08-01              6274     7313              904
6         103609  2018-11-01              5726     8189              642
7         103609  2018-07-01              5726     8189             1044
8         103609  2018-08-01              5726     8189              968
9         103609  2018-06-01              5726     8189              886
10        103617  2018-07-01              6549     7457             1140
11        103634  2018-06-01              8835     7794             1434
12        103637  2018-07-01              6920     6623              779
13        103644  2018-06-01              8481     8253             1022
14        103645  2018-11-01              8220     9966             1422
15        103645  2018-06-01              8220     9966             1499
16        103645  2018-07-01              8220     9966             1359
17        103645  2018-08-01              8220     9966              894

答案 3 :(得分:0)

您要使用随机函数 这是一个简单的选项

   from random import random
   df.disbursedamount = df.SanctionedAmount * (random()/5)

答案 4 :(得分:0)

从您的预期输出中,您似乎不需要逻辑“应用于每个帐户id组”,即不需要groupby之类的功能。所以每一行的解决方案是

import pandas as pd
import numpy as np

# df = the_DataFrame_you_have
df['disbursedamount'] = df['SanctionedAmount'] * np.random.uniform(0.1, 0.2)