Используйте Series.sample
с frac=0.2
. Затем используйте loc
для выбора этих индексов и замените их значение на 100
:
# example dataframe
import random
df = pd.DataFrame({'Col1':[random.randint(1,10) for x in range(10)],
'Col2':[random.randint(1,10) for x in range(10)]})
print(df)
Col1 Col2
0 1 3
1 1 6
2 3 9
3 9 5
4 10 4
5 10 2
6 10 7
7 4 5
8 10 7
9 10 9
idx = df['Col1'].sample(frac=0.2).index
df.loc[idx, 'Col1'] = 100
Col1 Col2
0 100 3
1 1 6
2 100 9
3 9 5
4 10 4
5 10 2
6 10 7
7 4 5
8 10 7
9 10 9
Или, чтобы сделать его более общим, без жесткого кодирования 0.2
и 100
, вот функциякоторый возвращает желаемый фрейм данных:
def replace_sample(dataframe, column, fraction, val_replace):
idx = dataframe[column].sample(frac=fraction).index
dataframe.loc[idx, column] = val_replace
return dataframe
replace_sample(df, 'Col1', 0.2, 100)
Col1 Col2
0 2 5
1 5 1
2 4 3
3 10 10
4 100 5
5 6 7
6 10 1
7 8 8
8 100 9
9 2 7