如何按miR21阈值8拆分DataFrame并新增1/0标记的group列
pandas 基于列阈值新增二分类分组列最优实现
你的数据集结构参考:
针对你需要按miR21列阈值8新增group列(>=8赋值1,<8赋值0)的需求,性能最优、代码最简洁的实现是直接利用pandas矢量化布尔运算的特性,布尔值转整数时True会自动映射为1、False自动映射为0,完全匹配你的赋值规则,核心代码仅需1行:
df['group'] = (df['miR21'] >= 8).astype(int)
其他等价实现(非最优场景说明)
以下写法也能实现需求,但在单阈值二分类场景下没有必要,仅适合特定扩展场景:
- 用
numpy.where做条件判断:逻辑和上面完全等价,代码稍显冗余,性能基本一致import numpy as np df['group'] = np.where(df['miR21'] >= 8, 1, 0) - 用
pandas.cut做分箱赋值:适合后续需要扩展为多阈值、多分组的场景,单阈值二分类下写法过重df['group'] = pd.cut( df['miR21'], bins=[-float("inf"), 8, float("inf")], labels=[0, 1] ).astype(int)
避坑提醒:不要使用
df.apply加lambda逐行判断赋值,矢量化运算的运行效率比逐行apply高10~100倍,数据集体量越大性能差距越明显。
结果校验
你可以用以下代码确认新生成的group列和你之前拆分的两个子集完全匹配:
# 校验分组样本量和之前拆分的子集一致 assert df[df['group'] == 1].shape[0] == dfn21h.shape[0] assert df[df['group'] == 0].shape[0] == dfn21l.shape[0]
内容的提问来源于stack exchange,提问作者Mischa
相关产品推荐
相关产品推荐

