根据分类列创建填充有随机元素的新列

时间:2019-04-26 18:58:25

标签: python dataframe random

我有一个熊猫数据框,如下所示:

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

列ID具有唯一的整数,而Cat包含分类变量。 现在,我想添加两个关于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,将SAME类别作为当前行ID,并进行替换。随机选择的ID不应与当前行ID相同。

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

如何有效地做到这一点?

2 个答案:

答案 0 :(得分: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)第1个:

 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()获得随机结果。

答案 1 :(得分:0)

我先前的回答未正确生成列“ 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