我有一个熊猫数据框,如下所示:
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,并进行替换。
如何有效地做到这一点?
答案 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