【问题标题】:How to randomly generate an unobserved data in Python3如何在 Python3 中随机生成未观察到的数据
【发布时间】:2019-07-17 19:38:03
【问题描述】:

我有一个包含观察数据的数据框:

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 一月采用dog1

第二行表示:human1 一月采用dog2

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

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

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

喜欢human1January,他不收养狗[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 月的活动。因此,对于每个月,我们都希望随机创建未观察到的数据。例如,在一月份,human2 采用dog1dog4god 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

有什么快速的方法吗?

PS:这是一个初创公司的代码面试。

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    【讨论】:

    • 说得好,你知道如何修复未观察到的数据数量吗?例如,对于每对(humanID, dogID),我们只需要two未观察到的样本。
    • @jason 我的意思是 groupby 应该在最终输出 df_new
    • 我试试你的代码。似乎df_new 有时包含原始df 中观察到的行。如何确保那些未观察到的数据不会出现在df 的行中?谢谢
    • 我将编辑问题以使其更清晰。感谢您的建议。
    • 现在问题更清楚了。 df_newdf 的交集应该是 null。我还在考虑如何根据你的代码来实现
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多