在Pandas中根据两列最大值来源生成标记列(MEN=1、WOMEN=0)
生成Pandas DataFrame的sex列解决方案
给定如下Pandas DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'WOMEN':[0,1,3,1,2,0,0], 'MEN':[2,3,1,2,0,0,1]})
需求规则:
- 新增
sex列:- 若
MEN列值为该行最大值,标记为1 - 若
WOMEN列值为该行最大值,标记为0 - 若两列值相等,随机标记0或1
- 若
实现步骤
- 初始化sex列:先填充明确匹配规则的标记,相等行暂设为
NaN
df['sex'] = np.where(df['MEN'] > df['WOMEN'], 1, np.where(df['WOMEN'] > df['MEN'], 0, np.nan))
- 处理相等行的随机标记:筛选出未赋值的行,生成随机0/1填充
# 获取两列值相等的行索引 equal_rows_idx = df[df['sex'].isna()].index # 生成对应长度的随机0/1数组 random_labels = np.random.randint(0, 2, size=len(equal_rows_idx)) # 填充到对应位置 df.loc[equal_rows_idx, 'sex'] = random_labels
- 添加id列(匹配预期结果格式)
df['id'] = range(1, len(df)+1) # 调整列顺序与示例一致 df = df[['id', 'WOMEN', 'MEN', 'sex']]
示例输出
执行后得到的DataFrame类似(相等行的随机值可能不同):
| id | WOMEN | MEN | sex |
|---|---|---|---|
| 1 | 0 | 2 | 1 |
| 2 | 1 | 3 | 1 |
| 3 | 3 | 1 | 0 |
| 4 | 1 | 2 | 1 |
| 5 | 2 | 0 | 0 |
| 6 | 0 | 0 | 0 |
| 7 | 0 | 1 | 1 |
内容的提问来源于stack exchange,提问作者Ramiro Guzmán
相关产品推荐
相关产品推荐

