【问题标题】:Create new column filled with random elements based on a categorical column根据分类列创建用随机元素填充的新列
【发布时间】:2019-04-26 18:58:25
【问题描述】:

我有一个看起来像这样的 pandas 数据框:

ID  Cat
87    A 
56    A 
67    A  
76    D  
36    D 

列 ID 具有唯一整数,而 Cat 包含分类变量。 现在我想添加两个关于猫的新列。

理想的结果应该是这样的:

ID  Cat  New1   New2
87    A    67    36
56    A    67    76
67    A    56    36
76    D    36    56
36    D    76    67

列 New1:对于每一行,选择一个与当前行 ID 具有相同类别的随机 ID,并进行替换。随机选取的 ID 不应与当前行 ID 相同。

列 New2:为每一行选择一个与当前行 ID 具有不同类别的随机 ID,并进行替换。

我怎样才能有效地做到这一点?

【问题讨论】:

    标签: python dataframe random


    【解决方案1】:

    我尝试使用向量找到解决方案,但无法解决。此解决方案遍历索引并计算 New1 和 New2 的新值。

    这将达到我相信您正在寻找的结果。

    for i in df.index:
        # Grab the category variable for each row.
        cat = df.loc[i,'Cat']
    
        # Set column New1
        mask1 = df['Cat'] == cat
        mask2 = df.index != i
        df.at[i,'New1']= df[mask1 & mask2]["ID"].sample().iloc[0]
    
        # Set column New2
        mask3 = df['Cat'] != cat
        df.at[i,'New2']= df[mask3]["ID"].sample().iloc[0]
    

    print(df) 第一个:

     ID Cat  New1  New2
    0  87   A  56.0  76.0
    1  56   A  87.0  36.0
    2  67   A  56.0  76.0
    3  76   D  36.0  87.0
    4  36   D  76.0  87.0
    

    print(df) 第二个:

      ID Cat  New1  New2
    0  87   A  67.0  36.0
    1  56   A  87.0  36.0
    2  67   A  87.0  76.0
    3  76   D  36.0  67.0
    4  36   D  76.0  67.0
    

    您可以从这些结果中看到,您通过使用 sample() 获得了随机结果。

    【讨论】:

      【解决方案2】:

      我之前的回答没有正确生成“new1”列。了解到一个有效的解决方案已经发布并被接受,我发布这个是为了提供一个替代方案。

      df = pd.DataFrame.from_dict({'ID':(87,56,67,76,36),'CAT':('A','A','A','D','D')})
      df['New1'] = [np.random.choice(df[(df['CAT']==cat) & (df['ID']!=iden)]['ID']) for cat, iden in zip(df['CAT'],df['ID'])]
      df['New2'] = [np.random.choice(df[df['CAT']!=cat]['ID']) for cat in df['CAT']]
      
      
      In [11]: df
      Out[12]: 
        CAT  ID  New1  New2
      0   A  87    67    76
      1   A  56    67    76
      2   A  67    56    36
      3   D  76    36    87
      4   D  36    76    67
      

      【讨论】:

      • 不,ID 不能为零。提供的代码适用于 New2 列,但 New1 列不符合我对它应该如何的描述。
      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多