Pandas数据框随机地随机分组某些列值

问题描述 投票:1回答:1

我想只对特定组中的某些列值和该组中行的一定百分比的行进行混洗。例如,对于每个组,我想将b列中n%的值彼此改组。

df = pd.DataFrame({'grouper_col':[1,1,2,3,3,3,3,4,4], 'b':[12, 13, 16, 21, 14, 11, 12, 13, 15]})

   grouper_col   b
0            1  12
1            1  13
2            2  16
3            3  21
4            3  14
5            3  11
6            3  12
7            4  13
8            4  15

示例输出:

   grouper_col   b
0            1  13
1            1  12
2            2  16
3            3  21
4            3  11
5            3  14
6            3  12
7            4  15
8            4  13

我发现

df.groupby("grouper_col")["b"].transform(np.random.permutation)

但后来我无法控制混排值的百分比。

谢谢您的提示!

python pandas pandas-groupby permutation shuffle
1个回答
1
投票

您可以使用numpy创建这样的函数(需要输入一个numpy数组)

import numpy as np

def shuffle_portion(arr, percentage): 
    shuf = np.random.choice(np.arange(arr.shape[0]),  
                            round(arr.shape[0]*percentage/100), 
                            replace=False) 
    arr[np.sort(shuf)] = arr[shuf] 
    return arr

np.random.choice将选择所需大小的一组索引。然后,可以按重新排列的顺序重新排列给定数组中的相应值。现在,这应该从cloumn 'b'

的9个值中抽出3个值
df['b'] = shuffle_portion(df['b'].values, 33)

编辑:要与apply一起使用,您需要将传递的数据帧转换为函数内部的数组(在注释中说明),并创建返回数据帧。

def shuffle_portion(_df, percentage=50): 
    arr = _df['b'].values
    shuf = np.random.choice(np.arange(arr.shape[0]),  
                            round(arr.shape[0]*percentage/100), 
                            replace=False) 
    arr[np.sort(shuf)] = arr[shuf] 
    _df['b'] = arr
    return _df
© www.soinside.com 2019 - 2024. All rights reserved.