【发布时间】:2021-05-10 11:37:33
【问题描述】:
我有以下数据框:
d = {'Name1':['jaap','piet','tim'],'Name2':['bas','max','piet'], 'Count1':[1,5,2],'Count2' :[2,6,8], 'Win','[1,2,2]}
data = pd.DataFrame(d)
Name1 Name2 Count1 Count2 Win
0 jaap bas 1 2 1
1 piet max 5 6 2
2 tim piet 2 8 2
现在我想逐行成对随机打乱列。所以Count1 属于Name1 和Count2 属于Name2。因此,如果Name1 列中的名称与Name2 中的名称混排,那么Count1 列中的值也会与Count2 列中的值混排。但也必须将最后一列 Win 中的值从 2 更改为 1,反之亦然,只要在特定行中应用随机播放。
示例输出为:
Name1 Name2 Count1 Count2 Win
0 bas jaap 2 1 2
1 piet max 5 6 2
2 piet tim 8 2 1
在此,0 和 2 的行被打乱了。
论文集:
np.apply_along_axis(np.random.permutation, 1, data[['Name1','Name2']])
np.apply_along_axis(np.random.permutation, 1, data[['Count1','Count2']])
但这并不能确保 Name1 和 Name2 与 Count1 和 Count2 应用相同的随机播放。
还有:
data['random'] = np.random.choice(2,len(data))
data['random1'] = data['random'].replace([1,0],[0,1])
name1 = data['Name1'].copy()
name2 = data['Name2'].copy()
count1 = dft['Count1'].copy()
count2 = data['Count2'].copy()
data['Name1'] = name1 * data['random'] + name2 *data['random1']
data['Name2'] = name1 * data['random1'] + name2 * data['random']
data['Count1'] = odds1 * data['random'] + count2 *data['random1']
data['Count2'] = odds1 * data['random1'] + count2 * data['random']
第二种方法适用于列对 Name 和 Count,但不适用于最后一个 win 列。我正在寻找一种可以轻松应用于多列对的更好方法。
【问题讨论】: