基于状态列值与缺失的区域信息删除DataFrame指定行的方法问询
基于状态列值与缺失的区域信息删除DataFrame指定行的方法问询
看起来你遇到了两个核心需求:一是批量删除某个ID的所有条目(因为该ID对应的status标记为deleted),二是移除region为空的行。不过首先得先处理原始数据里跨行的空ID和空name——这些缺失值会干扰后续的筛选操作,咱们一步步来解决:
步骤1:先补全缺失的ID和name值
你的数据里,同一个ID的条目只有第一行有完整的id和name,后续行都是空值。我们可以用ffill()(向前填充)把这些空值补上,让每一行都关联到正确的ID和名称:
import pandas as pd data = {'id': {0: '1',1: '',2: '', 3: '', 4: '2', 5: '', 6: '', 7: '', 8: '3', 9: '', 10: '', 11: '', 12: '4', 13: '', 14: '', 15: ''}, 'name': {0: 'foo', 1: '', 2: '', 3: '', 4: 'bar', 5: '', 6: '', 7: '', 8: 'baz', 9: '', 10: '', 11: '', 12: 'buz', 13: '', 14: '', 15: ''}, 'status': {0: '', 1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: '', 8: 'deleted', 9: '', 10: '', 11: '', 12: '', 13: '', 14: '', 15: ''}, 'region': {0: 'north', 1: 'east', 2: 'west', 3: 'south', 4: 'north', 5: 'east', 6: 'west', 7: '', 8: 'north', 9: 'east', 10: 'west', 11: 'south', 12: 'north', 13: 'east', 14: 'west', 15: 'south'}, 'category': {0: 'a', 1: 'a', 2: 'a', 3: 'a', 4: 'b', 5: 'b', 6: 'b', 7: 'b', 8: 'c', 9: 'c', 10: 'c', 11: 'c', 12: 'd', 13: 'd', 14: 'd', 15: 'd'}} df = pd.DataFrame(data) # 向前填充空的id和name值 df['id'] = df['id'].ffill() df['name'] = df['name'].ffill()
步骤2:定位需要删除的ID集合
现在可以轻松找出所有status为deleted的ID,这些ID的所有条目都需要被移除:
# 获取所有标记为deleted的id deleted_ids = df[df['status'] == 'deleted']['id'].unique()
步骤3:筛选符合要求的最终行
接下来我们只保留两类行:ID不在删除列表中,并且region不为空的行:
# 筛选最终结果 filtered_df = df[(~df['id'].isin(deleted_ids)) & (df['region'] != '')]
执行完上述代码后,filtered_df的结果就和你期望的一致了:
id name status region category 0 1 foo north a 1 1 foo east a 2 1 foo west a 3 1 foo south a 4 2 bar north b 5 2 bar east b 6 2 bar west b 12 4 buz north d 13 4 buz east d 14 4 buz west d 15 4 buz south d
关于你之前遇到的问题解释
你之前用groupby得到的结果里出现了额外的False行,是因为原始数据中存在空白ID的行(比如索引7),groupby会把空白ID当成一个独立的分组。补全ID的空值后,这个问题就自然解决了。
备注:内容来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

