【Python Pandas】基于列值筛选DataFrame:保留未完成父节点及子节点
修正Excel转DataFrame后的筛选逻辑
原代码的核心问题
- 父节点识别错误:原代码仅排除
PRO开头的条目,未按照需求筛选**以WP/CH开头且不含“.”**的父节点 - 未完成父节点判断逻辑失效:使用
((x !=100)|(x!=1.0))会导致所有父节点都被判定为未完成(一个数值不可能同时等于100和1.0),无法准确识别已完成的父节点 - 子节点匹配逻辑错误:原代码只要
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
相关产品推荐
相关产品推荐

