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

【Python Pandas】基于列值筛选DataFrame:保留未完成父节点及子节点

修正Excel转DataFrame后的筛选逻辑

原代码的核心问题

  1. 父节点识别错误:原代码仅排除PRO开头的条目,未按照需求筛选**以WP/CH开头且不含“.”**的父节点
  2. 未完成父节点判断逻辑失效:使用((x !=100)|(x!=1.0))会导致所有父节点都被判定为未完成(一个数值不可能同时等于100和1.0),无法准确识别已完成的父节点
  3. 子节点匹配逻辑错误:原代码只要Codice含点就保留,无法关联到对应的未完成父节点,会误保留无关的含点条目

修正后的代码

import pandas as pd

# 读取Excel文件(替换为你的文件路径)
df = pd.read_excel("你的Excel文件路径.xlsx")

# 1. 正确识别父节点:以WP/CH开头且不含“.”的条目
df['is_parent'] = df['Codice'].str.startswith(('WP/', 'CH/'), na=False) & ~df['Codice'].str.contains('\\.', na=False)

# 2. 识别未100%完成的父节点:兼容百分比为整数100或浮点数1.0的存储情况
incomplete_parents = df.loc[
    df['is_parent'] & ~df['% di completamento'].isin([100, 1.0]),
    'Codice'
].tolist()

# 3. 判断行是否需要保留:未完成父节点 或 属于未完成父节点的子节点
def should_keep(row):
    codice = row['Codice']
    # 是未完成父节点则保留
    if codice in incomplete_parents:
        return True
    # 是子节点则提取父前缀,判断是否属于未完成父节点
    if '.' in codice:
        parent_prefix = codice.split('.')[0]
        return parent_prefix in incomplete_parents
    # 其他情况不保留
    return False

df['keep'] = df.apply(should_keep, axis=1)

# 应用筛选规则
filtered_df = df[df['keep']].copy()

# 删除辅助列
filtered_df.drop(columns=['is_parent', 'keep'], inplace=True)

# 指定保留列并去除空值
columns_to_save = [
    'ID',
    'Codice',
    'Nome dell\'attività',
    'Effort stimato',
    'Inizio',
    'Fine',
    'Durata',
    'Effort consuntivato + Effort Stimato mancante',
    'Diff. Effort',
    '% di completamento',
    'Effort completato'
]
filtered_df = filtered_df[columns_to_save].dropna()

# 输出结果
print(filtered_df)

关键修正说明

  • 父节点精准识别:用str.startswith(('WP/', 'CH/'))匹配指定开头格式,同时排除含“.”的条目,完全符合需求定义
  • 未完成父节点判断:用~df['% di completamento'].isin([100, 1.0])覆盖百分比的两种存储形式,确保仅筛选出未完成的父节点
  • 子节点关联匹配:通过split('.')[0]提取子节点的父前缀,仅保留属于未完成父节点的子节点,避免误保留无关条目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:50:15