热线电话:13121318867

登录
2019-02-25 阅读量: 751
如何在Python3中随机生成未观察到的数据

我有一个数据框,其中包含观察到的数据:

import pandas as pd

d = {'humanID': [1, 1, 2,2,2,2 ,2,2,2,2], 'dogID':

[1,2,1,5,4,6,7,20,9,7],'month': [1,1,2,3,1,2,3,1,2,2]}

df = pd.DataFrame(data=d)

接下来df是

humanID dogID month

0 1 1 1

1 1 2 1

2 2 1 2

3 2 5 3

4 2 4 1

5 2 6 2

6 2 7 3

7 2 20 1

8 2 9 2

9 2 7 2

我们总共有两个human和二十个dog,以上df包含观察到的数据。例如:

第一行意味着:1月human1采用dog1

第二行意味着:1月human1采用dog2

第三行意味着:在二月份human2采用dog1

================================================== ======================

我的目标是two为每个(human, month)未出现在原始观察数据中的数据随机生成未观察到的数据。

喜欢human1在January,他不采用狗[3,4,5,6,7,..20]我想随机创建两个未观察到(human, month)的三重形式的样本

humanID dogID month

1 20 1

1 10 1

但是,不允许使用以下样本,因为它显示为原始样本 df

humanID dogID month

1 2 1

因为human1,他在2月没有任何活动,所以我们不需要对未观察到的数据进行采样。

因为human2,他有1月,2月和3月的活动。因此,对于每个月,我们要随机创建未观察到的数据。例如,1月,human2采用dog1,dog4和god 20。两个随机未观察到的样本可以是

humanID dogID month

2 2 1

2 6 1

同样的过程可以用于2月和3月。

我想将所有未观察到的数据放在一个数据框中,如下面 unobserved

humanID dogID month

0 1 20 1

1 1 10 1

2 2 2 1

3 2 6 1

4 2 13 2

5 2 16 2

6 2 1 3

7 2 20 3

解决办法:

使用groupby和random.choices:

import random

dogs = list(range(1,21))

dfs = []

n_sample = 2

for i,d in df.groupby(['humanID', 'month']):

h_id, month = i

sample = pd.DataFrame([(h_id, dogID, month) for dogID in random.choices(list(set(dogs)-set(d['dogID'])), k=n_sample)])

dfs.append(sample)

new_df = pd.concat(dfs).reset_index(drop=True)

new_df.columns = ['humanID', 'dogID', 'month']

print(new_df)

humanID dogID month

0 1 11 1

1 1 5 1

2 2 19 1

3 2 18 1

4 2 15 2

5 2 14 2

6 2 16 3

7 2 18 3

0.0000
2
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子