如何对pandas DataFrame应用多条件规则为行分配多个分类并生成新列
Pandas DataFrame多分类标签匹配方案
实现思路
- 预先定义分类标签与对应匹配规则的映射关系
- 对每行数据遍历所有规则,收集全部匹配成功的标签,存入新增的Type列
方案1:行遍历实现(规则较多时编写更简便)
适合数据量不大、规则数量多的场景,代码逻辑直观易维护:
import pandas as pd # 构造示例输入DataFrame df = pd.DataFrame({ 'Name': ['Jai', 'Princi', 'Gaurav', 'Anuj'], 'Height': [5.1, 6.2, 5.1, 5.2], 'Qualification': ['Msc', 'MA', 'Msc', 'Msc'] }) # 定义规则:格式为(标签名, 匹配条件函数) rules = [ ('A', lambda row: row['Height'] < 6 and row['Qualification'] == 'Msc'), ('B', lambda row: row['Height'] < 5.2) ] # 逐行匹配所有规则,生成Type列 df['Type'] = df.apply( lambda row: [tag for tag, condition in rules if condition(row)], axis=1 ) print(df)
输出结果和期望的完全一致。
方案2:向量化实现(大数据量场景性能更优)
避免逐行遍历的性能损耗,适合十万行及以上的数据集:
import pandas as pd df = pd.DataFrame({ 'Name': ['Jai', 'Princi', 'Gaurav', 'Anuj'], 'Height': [5.1, 6.2, 5.1, 5.2], 'Qualification': ['Msc', 'MA', 'Msc', 'Msc'] }) # 先计算每个规则的布尔掩码(向量化运算,效率极高) mask_a = (df['Height'] < 6) & (df['Qualification'] == 'Msc') mask_b = df['Height'] < 5.2 # 初始化Type列为空列表 df['Type'] = [[] for _ in range(len(df))] # 给匹配对应规则的行追加标签 df.loc[mask_a, 'Type'] = df.loc[mask_a, 'Type'].apply(lambda x: x + ['A']) df.loc[mask_b, 'Type'] = df.loc[mask_b, 'Type'].apply(lambda x: x + ['B']) print(df)
内容的提问来源于stack exchange,提问作者Ben George
相关产品推荐
相关产品推荐

