Pandas DataFrame满足双条件时向指定列填充值失败问题咨询
问题修复方案
错误原因
你写的代码存在3个核心问题:
- 调用
apply时是对Selected列做逐元素处理,lambda表达式内调用的df['Name']、df['Age']是全列对象,无法拿到当前行的对应值 .any()方法返回的是布尔值(判断整个序列是否存在真值),用布尔值和'Tom'、数值25做比较永远不成立,所以所有行都走else分支返回空字符串Age列存储的是字符串类型,直接和数值25做比较逻辑不成立,需要先转为数值类型
最优实现(pandas推荐向量化操作,性能远高于apply)
代码如下:
import pandas as pd data = {'Name': ['Tom', 'Joseph', 'Krish', 'John'], 'Age': ['20', '35', '43', '50'], 'Selected': ' '} df = pd.DataFrame(data) # 转换Age列为整数类型 df['Age'] = df['Age'].astype(int) # 构造匹配条件 match_mask = (df['Name'] == 'Tom') & (df['Age'] < 25) # 符合条件的行填充对应Name值,其余填充空字符串 df.loc[match_mask, 'Selected'] = df.loc[match_mask, 'Name'] df.loc[~match_mask, 'Selected'] = '' print(df)
运行后输出结果:
Name Age Selected 0 Tom 20 Tom 1 Joseph 35 2 Krish 43 3 John 50
可选:行级apply实现
如果要使用apply语法,需要设置按行遍历(axis=1),直接取当前行的字段做判断:
df['Age'] = df['Age'].astype(int) df['Selected'] = df.apply(lambda row: row['Name'] if row['Name'] == 'Tom' and row['Age'] < 25 else '', axis=1)
内容的提问来源于stack exchange,提问作者user01
相关产品推荐
相关产品推荐

