【问题标题】:Shuffle columns in pairs成对洗牌
【发布时间】: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 属于Name1Count2 属于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

在此,02 的行被打乱了。

论文集:

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']

第二种方法适用于列对 NameCount,但不适用于最后一个 win 列。我正在寻找一种可以轻松应用于多列对的更好方法。

【问题讨论】:

    标签: pandas random shuffle


    【解决方案1】:

    我们可以在argsort 之后生成random 样本,以获得随机打乱的索引,这些索引可用于沿着axis=1 打乱给定的列,为了更改Win 列,我们可以创建一个掩码来如果顺序发生更改,则检查洗牌索引的顺序,然后通过反向映射替换 Win 中的值

    c1 = ['Name1', 'Name2']
    c2 = ['Count1', 'Count2']
    
    i = np.random.rand(len(data), 2).argsort(1)
    
    data[c1] = np.take_along_axis(data[c1].values, i, axis=1)
    data[c2] = np.take_along_axis(data[c2].values, i, axis=1)
    
    data['Win'] = data['Win'].where((i == [0, 1]).all(1), data['Win'].map({1:2, 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多