如何按比例调整指定数据列:实现数据集的要求取值
实现需求的函数方法
原始数据集:
| COMPANY | DATABREACH | CYBERBACKGROUND |
|---|---|---|
| A | 1 | 2 |
| B | 0 | 2 |
| C | 0 | 1 |
| D | 0 | 2 |
| E | 1 | 1 |
| F | 1 | 2 |
| G | 0 | 2 |
| H | 0 | 2 |
| I | 0 | 2 |
| J | 0 | 2 |
需求:针对DATABREACH列取值为1的案例,将其中40%的案例的CYBERBACKGROUND列设为2。
Python Pandas 实现方法
核心思路:筛选目标行→计算需修改的行数→随机选行修改→合并回原数据
import pandas as pd import numpy as np # 构造原始数据(实际使用时可替换为读取你的数据源) data = pd.DataFrame({ 'COMPANY': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], 'DATABREACH': [1, 0, 0, 0, 1, 1, 0, 0, 0, 0], 'CYBERBACKGROUND': [2, 2, 1, 2, 1, 2, 2, 2, 2, 2] }) # 1. 筛选DATABREACH=1的子集 breach_subset = data[data['DATABREACH'] == 1].copy() # 2. 计算需要修改的行数(按40%比例取整) modify_count = int(len(breach_subset) * 0.4) # 3. 随机挑选指定数量的行索引 selected_indices = np.random.choice(breach_subset.index, size=modify_count, replace=False) # 4. 将选中行的CYBERBACKGROUND设为2 breach_subset.loc[selected_indices, 'CYBERBACKGROUND'] = 2 # 5. 把修改后的子集更新回原数据 data.update(breach_subset) # 输出结果 print(data)
R Dplyr 实现方法
核心思路:分组处理→随机排序后选取前40%行修改值
library(dplyr) # 构造原始数据(实际使用时可替换为读取你的数据源) data <- data.frame( COMPANY = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"), DATABREACH = c(1, 0, 0, 0, 1, 1, 0, 0, 0, 0), CYBERBACKGROUND = c(2, 2, 1, 2, 1, 2, 2, 2, 2, 2) ) # 处理数据 processed_data <- data %>% # 按DATABREACH分组 group_by(DATABREACH) %>% # 随机打乱行顺序,确保选取的是随机样本 sample_frac(1) %>% # 对DATABREACH=1的组,将前40%行的CYBERBACKGROUND设为2,其余保持原样 mutate( CYBERBACKGROUND = ifelse( DATABREACH == 1 & row_number() <= n() * 0.4, 2, CYBERBACKGROUND ) ) %>% ungroup() # 输出结果 print(processed_data)
说明:如果需要更精确的比例(比如非整数时向上/向下取整),可以调整modify_count的计算方式(比如用round()或math.ceil());两种方法都保证了修改的是随机选取的40%目标行。
内容的提问来源于stack exchange,提问作者Robbert
相关产品推荐
相关产品推荐

