Вы можете использовать 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
выберет набор индексов нужного вам размера. Тогда соответствующие значения в данном массиве могут быть переставлены в случайном порядке. Теперь это должно перемешать 3 значения из 9 в cloumn 'b'
df['b'] = shuffle_portion(df['b'].values, 33)
EDIT : для использования с 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
Теперь вы можете просто сделать
df.groupby("grouper_col", as_index=False).apply(shuffle_portion)
Было бы лучше, если вы передадите имя столбца, который нужно перетасовать, в функцию (def shuffle_portion(_df, col='b', percentage=50): arr = _df[col].values ...
)