我想只对特定组中的某些列值和该组中行的一定百分比的行进行混洗。例如,对于每个组,我想将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)
但后来我无法控制混排值的百分比。
谢谢您的提示!
您可以使用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'
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