如何在Python3中随机生成未观察到的数据

问题描述 投票:2回答:2

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

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以上包含观察到的数据。例如:

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

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

第三排意味着:qazxsw poi在二月采用了qazxsw poi

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

我的目标是随机生成每个human2dog1未观察数据,这些数据未出现在原始观察数据中。

喜欢在two(human, month),他不采用狗human1我想随机创建两个未观察到的样本January三重形式

[3,4,5,6,7,..20]

但是,不允许使用以下样本,因为它出现在原始的(human, month)

humanID dogID month
   1      20    1
   1      10    1

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

对于 humanID dogID month 1 2 1 ,他有1月,2月和3月的活动。因此,对于每个月,我们要随机创建未观察到的数据。例如,1月,human1采用human2human2dog1。两个随机未观察到的样本可以是

dog4

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

我想将所有未观察到的数据放在一个数据框中,例如跟随god 20

humanID dogID month
   2      2    1
   2      6    1

有什么快速的方法吗?

PS:这是一家初创公司的代码访谈。

python-3.x pandas dataframe random sampling
2个回答
1
投票

使用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

1
投票

如果我理解正确,你可以使用random.choicesimport 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 列生成列的随机排列,

np.random.permutation()

或者在dogID范围内创建缺失值的随机抽样:

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