Python中如何基于年龄列表在IF条件中筛选DataFrame姓氏?
如何基于年龄列表正确筛选姓氏?
你的问题出在列表推导式的逻辑上——当前的写法会遍历list_age里的每一个元素,只要age != x就执行一次append操作。比如年龄为12的条目,会满足12 !=13、12 !=11、12 !=10三个条件,对应的姓氏会被添加3次;而年龄为13的条目,会满足13 !=11和13 !=10两个条件,姓氏被添加2次,这就导致结果里出现大量重复项。
下面是几种正确的实现方式:
方法1:修改循环判断逻辑(最直观)
直接用age not in list_age替代逐个判断,只要年龄不在排除列表里,就添加一次姓氏:
list_age = [13,11,10] list_n = [] for age, surname in zip(df.Age, df.Surname): if age not in list_age: list_n.append(surname)
执行后list_n的结果就是正确的:['Black', 'Ferrari', 'Red', 'Man']
方法2:用列表推导式直接生成结果(更简洁)
把判断逻辑整合到列表推导式中,一步生成目标列表:
list_age = [13,11,10] list_n = [surname for age, surname in zip(df.Age, df.Surname) if age not in list_age]
这种写法和方法1逻辑一致,但代码更紧凑,是更Pythonic的写法。
方法3:利用Pandas内置方法(最高效)
既然你已经在使用DataFrame,推荐直接用Pandas的isin方法结合取反操作,避免手动循环,效率更高(尤其是数据量较大时):
list_age = [13,11,10] list_n = df[~df['Age'].isin(list_age)]['Surname'].tolist()
这里df['Age'].isin(list_age)会返回一个布尔Series,表示每行年龄是否在排除列表中,~符号用来取反,筛选出不在列表中的行,最后提取Surname列并转为列表即可。
内容的提问来源于stack exchange,提问作者Lorenzo Negri




