如何在Python3中随机生成不可观察的数据

时间:2019-02-24 03:58:59

标签: python-3.x pandas dataframe random sampling

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

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

第三行表示:human2在2月采用dog1

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

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

就像human1的{​​{1}}一样,他没有领养狗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 ,他在2月没有任何活动,因此我们不需要对未观察到的数据进行采样。

对于human1,他的活动时间为1月,2月和3月。因此,对于每个月,我们要随机创建未观察到的数据。例如,在1月,human2采用human2dog1dog4。这两个随机未观察到的样本可以是

god 20

2月和3月可以使用相同的过程。

我想将所有未观察到的数据放在一个数据框中,例如关注humanID dogID month 2 2 1 2 6 1

unobserved

有什么快速的方法吗?

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

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,则可以对dogID列使用np.random.permutation()来生成该列的随机排列,

df_new=df.copy()
df_new['dogID']=np.random.permutation(df.dogID)
print(df_new.sort_values('month'))

   humanID  dogID  month
0        1      1      1
1        1     20      1
4        2      9      1
7        2      1      1
2        2      4      2
5        2      5      2
8        2      2      2
9        2      7      2
3        2      7      3
6        2      6      3

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

df_new=df.copy()
a=np.random.permutation(range(df_new.dogID.min(),df_new.dogID.max()))
df_new['dogID']=np.random.choice(a,df_new.shape[0])
print(df_new.sort_values('month'))

   humanID  dogID  month
0        1     18      1
1        1     16      1
4        2      1      1
7        2      8      1
2        2      4      2
5        2      2      2
8        2     16      2
9        2     14      2
3        2      4      3
6        2     12      3

答案 1 :(得分:1)

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