pandas 使用随机条件数创建panda Dataframe 列

50few1ms  于 2023-03-11  发布在  其他
关注(0)|答案(2)|浏览(142)

我已经创建了以下Pandas Dataframe 。

import pandas as pd
import numpy as np

ds = {'col1' : [1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2],
      'col2' : [0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1]}

data = pd.DataFrame(data=ds)

看起来像这样

print(data)

    col1  col2
0      1     0
1      1     0
2      1     0
3      1     0
4      1     0
5      1     0
6      1     0
7      1     0
8      1     0
9      1     0
10     1     0
11     1     0
12     1     0
13     1     0
14     2     1
15     2     1
16     2     1
17     2     1
18     2     1
19     2     1
20     2     1
21     2     1
22     2     1
23     2     1
24     2     1
25     2     1
26     2     1
27     2     1

我需要根据以下条件创建一个新列(名为col3):
1.当col1 = 1时,有14条记录的col2 = 0。新列(即col3)需要有50%(正好是这14条记录的50%)的值等于col2(随机分布在这14条记录中),其余50%等于1。
1.当col1 = 2时,有14个记录的col2 = 1。新列(即col3)需要具有等于col2(随机分布在14个记录上)的值的50%(正好这14个记录的50%),并且剩余的50%等于0。
因此,生成的数据集如下所示(请记住,col3中值的位置或记录是随机分配的):

有人知道python代码来生成这样的 Dataframe 吗?

zyfwsgd6

zyfwsgd61#

groupby + sample

# take a sample of 50% from col2 per unique value in col1
data['col3'] = data.groupby('col1')['col2'].sample(frac=.5)

# fill the remaining 50% using a predefined mapping of col1 value
data['col3'] = data['col3'].fillna(data['col1'].map({1: 1, 2: 0}), downcast='infer')

结果

col1  col2  col3
0      1     0     1
1      1     0     0
2      1     0     0
3      1     0     0
4      1     0     0
5      1     0     0
6      1     0     0
7      1     0     1
8      1     0     0
9      1     0     1
10     1     0     1
11     1     0     1
12     1     0     1
13     1     0     1
14     2     1     1
15     2     1     0
16     2     1     1
17     2     1     0
18     2     1     0
19     2     1     1
20     2     1     1
21     2     1     0
22     2     1     1
23     2     1     0
24     2     1     0
25     2     1     1
26     2     1     1
27     2     1     0
qyswt5oh

qyswt5oh2#

我将使用df.sample()方法随机隔离条件内的所有子组,然后赋值

ds = {'col1' : [1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2],
      'col2' : [0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1]}

data = pd.DataFrame(data=ds)
data['col_3'] = 0

设置 Dataframe 并创建新的空列
现在让我们按条件选择

cond_1 = data.loc[(data.col1==1)&(data.col2==0)]
cond_2 = data.loc[(data.col1==2)&(data.col2==1)]

获取第一个条件的随机50%,然后获取剩余的50%

cond_1_A = cond_1.sample(frac=.5)
cond_1_B = cond_1.loc[cond_1.index.difference(cond_1_A.index)]

对于每个子组,将值设置为0或1

data.col_3.loc[cond_1_A.index] = 0
data.col_3.loc[cond_1_B.index] = 1

第二种情况-相同

cond_2_A = cond_2.sample(frac=.5)
cond_2_B = cond_2.loc[cond_2.index.difference(cond_2_A.index)]
data.col_3.loc[cond_2_A.index] = 0
data.col_3.loc[cond_2_B.index] = 1

应该够了。
运行1

data
    col1    col2    col_3
0   1   0   0
1   1   0   1
2   1   0   1
3   1   0   0
4   1   0   1
5   1   0   1
6   1   0   0
7   1   0   0
8   1   0   0
9   1   0   1
10  1   0   0
11  1   0   0
12  1   0   1
13  1   0   1
14  2   1   1
15  2   1   1
16  2   1   0
17  2   1   0
18  2   1   0
19  2   1   0
20  2   1   1
21  2   1   0
22  2   1   0
23  2   1   1
24  2   1   1
25  2   1   1
26  2   1   0
27  2   1   1

运行2

data
    col1    col2    col_3
0   1   0   1
1   1   0   0
2   1   0   1
3   1   0   1
4   1   0   1
5   1   0   0
6   1   0   1
7   1   0   0
8   1   0   0
9   1   0   0
10  1   0   1
11  1   0   0
12  1   0   0
13  1   0   1
14  2   1   1
15  2   1   0
16  2   1   0
17  2   1   1
18  2   1   1
19  2   1   1
20  2   1   1
21  2   1   0
22  2   1   1
23  2   1   0
24  2   1   0
25  2   1   1
26  2   1   0
27  2   1   0

相关问题