pandas DataFrame如何分离指定列并按行判断值生成新列
问题场景
需要处理的初始DataFrame如下:
import pandas as pd df =pd.DataFrame( data = {'m1' : [0,0,1,0,0,0,0,0,0,0,0], 'm2' : [0,0,0,0,0,1,0,0,0,0,0], 'm3' : [0,0,0,0,0,0,0,0,1,0,0], 'm4' : [0,1,0,0,0,0,0,0,0,0,0], 'm5' : [0,0,0,0,0,0,0,0,0,0,0], 'm6' : [0,0,0,0,0,0,0,0,0,1,0]} )
初始DataFrame内容:
m1 m2 m3 m4 m5 m6 0 0 0 0 0 0 0 1 0 0 0 1 0 0 2 1 0 0 0 0 0 3 0 0 0 0 0 0 4 0 0 0 0 0 0 5 0 1 0 0 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 8 0 0 1 0 0 0 9 0 0 0 0 0 1 10 0 0 0 0 0 0
需求为:
- 保留m1列,合并m2~m6的特征逻辑
- 逐行判断,m2到m6任意一列值为1时,新列
m_other赋值为1,否则赋值为0
期望输出:
m1 m_other 0 0 0 1 0 1 2 1 0 3 0 0 4 0 0 5 0 1 6 0 0 7 0 0 8 0 1 9 0 1 10 0 0
之前尝试使用any函数实现未成功。
实现方法
any函数完全可以实现这个需求,之前失败基本是因为没有指定axis=1参数——pandas的any默认按列(axis=0)判断整列是否有真值,我们需要的是逐行判断,所以必须指定按行聚合。
完整实现代码:
# 选中m2到m6的所有列,逐行判断是否存在1,布尔值转int即为0/1 df["m_other"] = df.loc[:, "m2":"m6"].any(axis=1).astype(int) # 提取需要的两列得到最终结果 res = df[["m1", "m_other"]]
如果m2到m6在表中不是连续排列的,可以手动传入列名列表选择:
df["m_other"] = df[["m2", "m3", "m4", "m5", "m6"]].any(axis=1).astype(int)
运行后得到的结果和预期完全一致。
逻辑说明:由于所有特征列的值只有0和1,
any会将1识别为True、0识别为False,逐行判断只要有一个True就返回该行结果为True,转换为整型后正好对应需要的1/0赋值,不需要额外写判断条件。
内容的提问来源于stack exchange,提问作者Dai
相关产品推荐
相关产品推荐

