You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于DataFrame字典/列表列判断分配type标签的实现方案

解决方法

我们可以通过矢量化判断高效生成type列(这是Pandas的最佳实践,比逐行遍历效率高得多),核心思路是先分别判断两个字段是否为非空有效数据,再组合条件生成对应标记。

1. 定义非空判断的辅助函数

针对diff_2(列表嵌套字典)和nonBreakingChanges(字典)的类型特点,写两个函数判断是否有有效内容:

def is_non_empty_diff(diff_list):
    # 确认是列表且长度大于0(即包含有效字典元素)
    return isinstance(diff_list, list) and len(diff_list) > 0

def is_non_empty_nb(nb_dict):
    # 确认是字典且非空
    return isinstance(nb_dict, dict) and len(nb_dict) > 0

2. 生成布尔标记列

用apply快速生成两个布尔列,标记对应字段是否非空:

df['diff_non_empty'] = df['diff_2'].apply(is_non_empty_diff)
df['nb_non_empty'] = df['nonBreakingChanges'].apply(is_non_empty_nb)

3. 组合条件生成type列

这里提供两种常用实现方式:

方式一:用numpy.select(直观清晰)

import numpy as np

# 定义条件与对应结果的映射
conditions = [
    (df['diff_non_empty'] & df['nb_non_empty']),
    (df['diff_non_empty'] & ~df['nb_non_empty']),
    (~df['diff_non_empty'] & df['nb_non_empty'])
]
choices = ['Both', 'B', 'NB']

df['type'] = np.select(conditions, choices, default=None)

方式二:用df.loc分步赋值

# 先初始化type列
df['type'] = None

# 根据条件逐一赋值
df.loc[df['diff_non_empty'] & df['nb_non_empty'], 'type'] = 'Both'
df.loc[df['diff_non_empty'] & ~df['nb_non_empty'], 'type'] = 'B'
df.loc[~df['diff_non_empty'] & df['nb_non_empty'], 'type'] = 'NB'

4. 可选:清理临时列

如果不需要保留diff_non_empty和nb_non_empty这两个中间列,直接删除即可:

df.drop(['diff_non_empty', 'nb_non_empty'], axis=1, inplace=True)

额外说明

  • 辅助函数里的类型校验是为了避免数据格式异常导致错误,如果你的数据集已经严格保证字段类型(比如diff_2一定是列表,nonBreakingChanges一定是字典),可以简化判断逻辑,比如直接用len(diff_2) > 0代替类型检查。
  • 矢量化操作在处理大数据量时,性能会比iterrows()这类逐行遍历方式提升数倍甚至数十倍。

内容的提问来源于stack exchange,提问作者Brie MerryWeather

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:30:18